只允许为特定类实现接口
本文关键字:实现 接口 | 更新日期: 2023-09-27 17:52:16
是否可能只允许一些特定的类实现一个接口?假设我创建了接口IMyInterface
,我只希望从UserControl
派生的类有能力实现我的接口。这可能吗?
您不能,但是您可以通过向接口添加Control属性来实现类似的功能,并按照约定使所有实现返回this
。不能解决你的问题,但会让实现者思考接口是否真的属于那里。还允许接口的用户以类型安全的方式检索控件,而不需要强制转换。
interface IMyInterface
{
void Foo();
UserControl Control { get; }
}
class MyControl : UserControl, IMyInterface
{
public void Foo()
{
// TODO: Write code here
}
UserControl IMyInterface.Control
{
get { return this; }
}
}
还有另一种解决方案——创建一个泛型方法。接口本身不会受到限制,但是操作的方法会受到限制。例如,下面的方法要求其参数既继承UserControl
又实现IMyInterface
:
void Bar<T>(T item)
where T : UserControl, IMyInterface
{
item.Width = 120; // user control property
item.Foo(); // IMyInterface method
}
我知道这是一个旧的帖子,但我必须解决这个问题。
你可以这样做:
class BaseClass { }
interface OnlyBaseClass<TSelf> where TSelf : BaseClass, OnlyBaseClass<TSelf>
{
}
class ChildClass : BaseClass, OnlyBaseClass<ChildClass> { }
class ImpostorClass : OnlyBaseClass<ImposterClass> { }
interface ImposterInterface : OnlyBaseClass<ImposterInterface > { }
尝试编译上面的代码。您将注意到它无法编译(由于两个冒名顶替者,一个是类,一个是接口)。
上的约束可以理解为:TSelf必须:继承自BaseClass 和实现OnlyBaseClass<<em>TSelf>
…只有继承了BaseClass并实现了OnlyBaseClass的类型才能做到。
你可以聪明一点,做以下事情:
class AdvancedImpostorClass : OnlyBaseClass<ChildClass> {}
…这将编译。您可以通过在任何接受这些类型的冒名顶替者作为参数的方法中使用相同的约束来防止这些类型的冒名顶替者进入您的代码,例如:
public SomeMethod<TBaseAndInterface>(TBaseAndInterface value)
where TBaseAndInterface: BaseClass, OnlyBaseClass<TBaseAndInterface>
{ }
这一切都是通过f界多态性的力量实现的。
听起来你想要这样做:
abstract class IMyInterface : UserControl { }
当然,IMyInterface
不再是一个合适的名称,但是任何从IMyInterface
派生的类也将从UserControl
派生,这将满足您的要求。
这不可能。如果你能看到接口,你就能实现它。
不,没有办法将接口的实现限制为特定类型。你为什么要这么做?为什么抽象的消费者关心实现该契约的具体类型?你的用例是什么?
你描述的情况似乎适合"父类中的抽象方法"(这里是userControl),除非该接口已经存在用于其他目的。
如果没有默认主体,派生类将不得不提供一个行为。