C# 确保接口实现继承自特定基 class
C# Make sure that interface implementation inherits from a particular base class
我有接口
public interface IInputReciever {
void OnRecieveInput(InputInfo Info);
}
和接口扩展 class
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
}
}
假设我有两个 classes 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 的子class,也不能保证是一个.
我能否以某种方式强制我的实现者从 X 派生以使这种情况起作用 - 或者是否有更好的方法来解决这个问题?
使用接口的意义在于表明您不关心实现细节,即class实现了接口什么。如果你必须强制派生的 classes 使用特定的实现,那么让 X 成为一个抽象基础 class,不要提供接口,并让你的扩展方法引用 X 而不是接口。
您可以使用通用方法。因此,您可以使用 where
.
public static void SubscribeToInput<TInputReciever>(this TInputReciever Reciever) where TInputReciever : IInputReciever, X
{
//Use member of X
}
由于通用类型参数的限制,这将强制接收器实现 IInputReceiver
和 X
。
我认为您可以使用带有约束的通用扩展方法:
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
}
}
我有接口
public interface IInputReciever {
void OnRecieveInput(InputInfo Info);
}
和接口扩展 class
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
}
}
假设我有两个 classes 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 的子class,也不能保证是一个.
我能否以某种方式强制我的实现者从 X 派生以使这种情况起作用 - 或者是否有更好的方法来解决这个问题?
使用接口的意义在于表明您不关心实现细节,即class实现了接口什么。如果你必须强制派生的 classes 使用特定的实现,那么让 X 成为一个抽象基础 class,不要提供接口,并让你的扩展方法引用 X 而不是接口。
您可以使用通用方法。因此,您可以使用 where
.
public static void SubscribeToInput<TInputReciever>(this TInputReciever Reciever) where TInputReciever : IInputReciever, X
{
//Use member of X
}
由于通用类型参数的限制,这将强制接收器实现 IInputReceiver
和 X
。
我认为您可以使用带有约束的通用扩展方法:
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
}
}