仅允许为特定类实现接口

时间:2011-04-23 21:47:03

标签: c# inheritance interface

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

6 个答案:

答案 0 :(得分: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; }
    }
}

<强>更新

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

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

答案 1 :(得分:6)

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

以下是如何做到这一点:

class BaseClass { }

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

}

class ChildClass : BaseClass, OnlyBaseClass<ChildClass> { }

class ImpostorClass : OnlyBaseClass<ImposterClass> { }

interface ImposterInterface : OnlyBaseClass<ImposterInterface > { }

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

TSelf 的约束可以理解为:

  

TSelf 必须:从BaseClass继承实现 OnlyBaseClass&lt; TSelf &gt;

...只有从 BaseClass 继承并实现 OnlyBaseClass 的类型才可以。

你可能很聪明,并执行以下操作:

class AdvancedImpostorClass : OnlyBaseClass<ChildClass> {}

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

public SomeMethod<TBaseAndInterface>(TBaseAndInterface value)
    where TBaseAndInterface: BaseClass, OnlyBaseClass<TBaseAndInterface>
{ }

这一切都是通过F-Bound Polymorphism的力量实现的。

答案 2 :(得分:3)

听起来你想要这样的东西:

abstract class IMyInterface : UserControl { }

当然IMyInterface不再是一个合适的名称,但是从IMyInterface派生的任何类也都来自UserControl,这将满足您的要求。

答案 3 :(得分:2)

这是不可能的。如果您可以看到界面,则可以实现它。

答案 4 :(得分:2)

不,没有办法将接口的实现限制为特定类型。你为什么需要?为什么抽象的消费者关心实现该合同的具体类型?你的用例是什么?

答案 5 :(得分:1)

您描述的案例似乎适合“父类中的抽象方法”(此处为userControl),除非该接口已存在用于其他目的。

如果没有默认主体,派生类就必须提供行为。