仅允许为特定类实现接口

tro*_*ron 17 c# inheritance interface

是否可以仅允许某些特定类实现iterface?假设我创建了接口IMyInterface,我只希望从中派生的类UserControl能够实现我的接口.这可能吗?

Ale*_*tof 10

你不能,但你可以通过向你的界面添加一个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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

还有另一种解决方案 - 制作通用方法.接口本身不受限制,但操作方法将是.例如,以下方法要求其参数既继承UserControl又实现IMyInterface:

void Bar<T>(T item)
  where T : UserControl, IMyInterface
{
    item.Width = 120;    // user control property
    item.Foo();          // IMyInterface method
}
Run Code Online (Sandbox Code Playgroud)


sho*_*121 6

我意识到这是一个老帖子,但我必须解决这个问题.

以下是如何做到这一点:

class BaseClass { }

interface OnlyBaseClass<TSelf> where TSelf : BaseClass, OnlyBaseClass<TSelf>
{

}

class ChildClass : BaseClass, OnlyBaseClass<ChildClass> { }

class ImpostorClass : OnlyBaseClass<ImposterClass> { }

interface ImposterInterface : OnlyBaseClass<ImposterInterface > { }
Run Code Online (Sandbox Code Playgroud)

尝试编译以上内容.你会注意到它没有编译(由于两个冒名顶替者,一个是一个类,一个是接口).

TSelf的约束可以理解为:

TSelf必须:从BaseClass继承实现OnlyBaseClass < TSelf >

...只有从BaseClass继承并实现OnlyBaseClass的类型才能做到.

你可能很聪明,并做以下事情:

class AdvancedImpostorClass : OnlyBaseClass<ChildClass> {}
Run Code Online (Sandbox Code Playgroud)

......将编译.您可以通过在接受它们作为参数的任何方法中使用相同的约束来阻止这些类型的冒名顶替者进入您的代码,如下所示:

public SomeMethod<TBaseAndInterface>(TBaseAndInterface value)
    where TBaseAndInterface: BaseClass, OnlyBaseClass<TBaseAndInterface>
{ }
Run Code Online (Sandbox Code Playgroud)

这一切都可以通过F-Bound多态的力量实现.


Fem*_*ref 2

这不可能。如果你能看到接口,你就可以实现它。