假设我有以下界面:
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);
}
现在这个基类可以工作,但是我遇到了已经从另一种类型继承的现有类型的问题......
是否有任何其他解决方法或设计模式可能在这里有所帮助?