[英]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.