C#确保接口实现继承自特定的基类

时间:2015-04-27 12:12:08

标签: c# inheritance interface extension-methods

我有一个界面

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派生以使这个场景有效 - 或者有更好的方法来解决这个问题吗?

3 个答案:

答案 0 :(得分:9)

使用接口的目的是表明您并不关心实现细节,即哪个类实现了接口。如果必须强制派生类使用特定的实现,那么将X设为抽象基类,不提供接口,并使扩展方法引用X而不是接口。

答案 1 :(得分:3)

您可以使用通用方法。因此,您可以使用where

public static void SubscribeToInput<TInputReciever>(this TInputReciever Reciever) where TInputReciever : IInputReciever, X
{ 
   //Use member of X
}

由于泛型类型参数的限制,这将迫使Receiver实现IInputReceiverX

答案 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
    }
}