C#。强制通用接口中的类型参数为实现该接口的类的类型

时间:2018-06-26 15:03:24

标签: c# generics design-patterns generic-interface

假设我具有以下界面:

interface IFoo<T>{}

我想知道是否可以强制实现该接口的任何类必须提供其自己的类名称作为类型参数。考虑一下IEquatable<T>界面,这样做是完全合法的:

class Moo:IEquatable<string>{ /*...*/}

尽管没有任何意义吧?现在假设我以以下方式修改IFoo

interface IFoo<T>
{
     void CopyObject(T obj);
}

我不想执行以下操作:

class Foo:IFoo<Boo>{
     public void CopyObject(Boo object){}
}

到目前为止,我已经尝试过:

interface IFoo<T> where T: IFoo<T>
{
    void CopyObject(T obj);
}

它的工作原理:

class Foo:IFoo<Boo> { /*implementation*/ } //does not compile!

class Boo { }

但是:

class Foo:IFoo<Boo> { /*implementation*/ } //it now copiles =(

class Boo:IFoo<Boo> { /*implementation*/ }

我想到的另一种方式是抽象的基类,如果事情不是我想要的方式,它就会因运行时异常而崩溃:

abstract class FooBase<T>
{
    protected FooBase()
    {
        if (typeof(T) != GetType())
        {
            throw new InvalidOperationException();
        }
    }

    protected abstract void CopyObject(T obj);
}

现在这个基类可以工作了,但是然后我对已经从另一个类型继承的现有类型有问题...

还有其他解决方法或设计模式可以帮助您吗?

0 个答案:

没有答案