我有一个界面
public interface IInputReciever {
void OnRecieveInput(InputInfo Info);
}
和接口扩展类
public static class IInputRecieverExtensions {
public static void SubscribeToInput(this IInputReciever Reciever) {
//Use member of X
}
public static void UnsubscribeFromInput(this IInputReciever Reciever) {
//Use member of X
}
}
我们说我有两个A和B班;但是,虽然只有B继承自X,但都实现了我的界面。
public class B : X, IInputReciever {
//Contains members of B and X
}
public class A : IInputReciever {
//Contains members of A only
}
在我的界面扩展中,我想使用X的成员,但是这不会编译,因为实现者不是X的子类,也不能保证是一个。
我可以以某种方式强制我的实现者从X派生以使这个场景有效 - 或者有更好的方法来解决这个问题吗?
答案 0 :(得分:9)
使用接口的目的是表明您并不关心实现细节,即哪个类实现了接口。如果必须强制派生类使用特定的实现,那么将X设为抽象基类,不提供接口,并使扩展方法引用X而不是接口。
答案 1 :(得分:3)
您可以使用通用方法。因此,您可以使用where
。
public static void SubscribeToInput<TInputReciever>(this TInputReciever Reciever) where TInputReciever : IInputReciever, X
{
//Use member of X
}
由于泛型类型参数的限制,这将迫使Receiver实现IInputReceiver
和X
。
答案 2 :(得分:1)
我认为您可以使用带约束的通用扩展方法:
public static class IInputRecieverExtensions{
public static void SubscribeToInput<T>(this T Reciever) where T : X, IInputReceiver {
//Use member of X
}
public static void UnsubscribeFromInput<T>(this T Reciever) where T : X, IInputReceiver {
//Use member of X
}
}