假设我有如下的类层次结构:
Class A {...}
Class B : A {...}
Class C : A {...}
我目前所拥有的是
Class D<T> where T : A {...}
但是我想要一些形式的
Class D<T> where T in {B,C}
这是由于一些奇怪的行为,我不负责B和C有共同的方法,而这些方法不在A中,但如果能在T上的D中调用它们就好了。
注意:我没有权限访问A、B或C来编辑它们
发布于 2010-06-21 23:21:15
你需要为B和C中的公共方法定义一个接口(让我们称之为Ibc),让B和C实现这个接口,然后你就可以写:
Class D<T> where T : A, Ibc {...}
发布于 2010-06-21 23:25:40
这不是直接可能的。
正如其他人所建议的,您可以定义一个接口并在B
和C
中实现它。
如果这不是一个选项(例如,如果这些类超出了您的控制范围),我可能会建议这样做:首先,从一个抽象类开始,它包含您可以使用从A
派生的任何T
实现的所有功能。然后假设您有一些既适用于B
又适用于C
的方法,这些方法不是A
的一部分。在D
中,您可以使这些抽象方法由子类实现:
public abstract class D<T> where T : A
{
protected T _member;
public void DoSomethingAllTsCanDo()
{
_member.DoSomething();
}
public abstract void DoSomethingOnlyBAndCCanDo();
}
然后,您可以从每个类型B
和C
的基类继承,并覆盖抽象方法以提供适当的功能:
public class DB : D<B>
{
public override void DoSomethingOnlyBAndCCanDo()
{
_member.DoSomethingOnlyBCanDo();
}
}
public class DC : D<C>
{
public override void DoSomethingOnlyBAndCCanDo()
{
_member.DoSomethingOnlyCCanDo();
}
}
发布于 2010-06-21 23:57:15
首先,如果B和C有共同的方法,这是一个设计缺陷,它们不共享一个接口。也就是说,您可以在不访问B和C的情况下修复它。
创建一个公共接口是可能的。假设你有:
public class A
{
}
public class B : A
{
public void Start() { }
}
public class C : A
{
public void Start() { }
}
您可以创建一个通用接口:
public interface IStartable
{
void Start();
}
并在B和C的派生类上使用它:
public class BetterB : B, IStartable
{
}
public class BetterC : C, IStartable
{
}
如果按原样获取B和C实例,您可能无法实现这一点,但如果您创建它们,则可以考虑这一点。实际上,对于B和C的专用类,您可以使用接口而不是D<T>
。
https://stackoverflow.com/questions/3085909
复制相似问题