考虑以下类层次结构:
public interface X { void Foo(); }
public interface Y { void Bar(); }
public class A : X, Y
{
public void Foo() {}
public void Bar() {}
}
public class B : X, Y
{
public void Foo() {}
public void Bar() {}
}
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以定义一个列表(或任何通用类型),它可以包含A's和B's',同时允许我将所述列表的内容视为两者X和Y?也就是说,这将允许我写下这样的内容:
var list = ???
list.Add(new A());
list.Add(new B());
list.First().Foo();
list.Last().Bar();
Run Code Online (Sandbox Code Playgroud)
编辑
只是为了澄清,我目前正在处理的类型是ObservableCollection<T>(A)和ReadOnlyObservableCollection<T>(B),我感兴趣的接口是IList<T>(X)和INotifyCollectionChanged(Y).很明显,我无法改变他们的类层次结构来满足我的需求,所以我需要一个不同的解决方法.
Mar*_*zek 15
不,除非您声明另一个界面:
IAB : IA, IB {}
Run Code Online (Sandbox Code Playgroud)
并让两个类实现它.
你也可以实现自己的集合类,这样List<IFirst, ISecond>就可以了.
您可能不希望修改A类和B类,因此包装器可以完成这项工作
public class XYWrapper : X, Y
{
private dynamic InternalObject { get; set; }
public void Foo() { InternalObject.Foo(); }
public void Bar() { InternalObject.Bar(); }
public static implicit operator XYWrapper(A value)
{
var instance = new XYWrapper();
instance.InternalObject = value;
return instance;
}
public static implicit operator XYWrapper(B value)
{
var instance = new XYWrapper();
instance.InternalObject = value;
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
所以你用这种方式使用它:
var list = new List<XYWrapper>();
list.Add(new A());
list.Add(new B());
list.First().Foo();
list.Last().Bar();
Run Code Online (Sandbox Code Playgroud)