繁体   English   中英

我有 3 个不同的类,具有相同的方法名称。 需要在使用前检查并应用它们的正确实例c#

[英]I have 3 different classes, with the same method names. Need to check before usage and apply the right instance of them c#

我有 3 个不同的类,但它们内部的方法相同。 需要在使用前检查并应用它们的正确实例 c#。 调用方法相同,但内部逻辑不同。 我需要能够在正确的时间调用正确的实例。 我尝试了一切,但似乎失败了。

接口不是一个选项,因为这些程序集以 DLL 的形式出现。 我没有他们的源代码。

public VersionAssembly240 obj1 = new VersionAssembly240();
public VersionAssembly250 obj2 = new VersionAssembly250();
public VersionAssembly260 obj3 = new VersionAssembly260();

void Main()
{
    ChooseRightInstance(null, obj2, null, "v25");

}

public void ChooseRightInstance(VersionAssembly240 obj1, VersionAssembly250 obj2, VersionAssembly260 obj3, string version)
{
    if (version == "v24")
    {
        var obj = obj1;
    }
    else if (version == "v25")
    {
        var obj = obj2;
    }
    else
    {
        var obj = obj3;
    }

    //I need to be able to access the obj var somce the 3 classess have the same access methods
    obj
}

//for testing
public class VersionAssembly260
{
    public string example()
    {
        return "v26";
    }
}

public class VersionAssembly250
{
    public string example()
    {
        return "v25";
    }
}

public class VersionAssembly240
{
    public string example()
    {
        return "v24";
    }
}

您必须使用方法example()和每个类的不同实现来创建接口。

public interface IVersionAssembly
{
    string example();
}

实现方法example()

public class VersionAssembly260 : IVersionAssembly
{
    public string example()
    {
        return "v26";
    }
}

public class VersionAssembly250 : IVersionAssembly
{
    public string example()
    {
        return "v25";
    }
}

public class VersionAssembly240 : IVersionAssembly
{
    public string example()
    {
        return "v24";
    }
}

现在使用的界面IVersionAssembly的方法ChooseRightInstance

public void ChooseRightInstance(VersionAssembly240 obj1, VersionAssembly250 obj2, VersionAssembly260 obj3, string version)
{
    IVersionAssembly obj;
    if (version == "v24")
    {
        obj = obj1;
    }
    else if (version == "v25")
    {
        obj = obj2;
    }
    else
    {
        obj = obj3;
    }

    obj.example();
}

您可以使用接口来实现这一点,假设这些类的真实版本都具有相同的公共方法。

现场演示: https : //dotnetfiddle.net/63hjQt

代码。 有关每个重要部分的更多信息,请参阅内联注释:

using System;

public class Program
{
    public static void Main() {
      VersionAssembly240 obj1 = new VersionAssembly240();
      VersionAssembly250 obj2 = new VersionAssembly250();
      VersionAssembly260 obj3 = new VersionAssembly260();
      ChooseRightInstance( null, obj2,  null ,  "v25" );
    }

    public static void ChooseRightInstance(VersionAssembly240 obj1, VersionAssembly250 obj2, VersionAssembly260 obj3, string version) 
    {
      IVersionAssembly obj; //declare the object outside the if, as an instance of the interface
      if (version == "v24")
      {
        obj = obj1;
      }
      else if (version == "v25")
      {
        obj = obj2;
      }
      else
      {
        obj = obj3;
      }

      Console.WriteLine(obj.example()); //can call the example() method because the interface defines it
    } 
}

//interface which defines the methods which all the classes must implement    
public interface IVersionAssembly
{
    string example();
}

//all the classes implement the interface, but within the methods they can use different concrete implementations
public class VersionAssembly260 : IVersionAssembly
{
    public string example()
    {
        return "v26";
    }
}

public class VersionAssembly250 : IVersionAssembly
{
    public string example()
    {
        return "v25";
    }
}

public class VersionAssembly240 : IVersionAssembly
{
    public string example()
    {
        return "v24";
    }
}

这是微软的 C# 接口指南: https : //docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/

你可以试试下面

// make abstract base class
public abstract class BaseVersionAssembly
{
    public abstract string example();
}

public class VersionAssembly260 : BaseVersionAssembly
{
    public override string example()
    {
        return "v26";
    }
}

public class VersionAssembly250 : BaseVersionAssembly
{
    public override string example()
    {
        return "v25";
    }
}

public class VersionAssembly240 : BaseVersionAssembly
{
    public override string example()
    {
        return "v24";
    }


}

ChooseRightInstance 函数

public string ChooseRightExample(BaseVersionAssembly obj)
{
    return obj.example();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM