我有一个接口IFoo
,它实现了一个方法Bar
IFoo
接受泛型参数T
。此泛型参数定义Bar
接受的参数类型。
public interface IFoo<T> { public void Bar(T value); }
相当基本。但有时,Bar
没有必要接受任何论点。为了实现这一点,我创建了第二个接口,也称为IFoo
,它不接受任何泛型参数。
public interface IFoo { public void Bar(); }
这是可行的,但考虑到技术上有两个不同的IFoo
,每当我想更新IFoo
时,它都会增加开销。如果我想向接口添加第二个方法,我现在必须执行两次。这也会影响任何实现IFoo
的类。如果我有一个实现IFoo
的类Baz
,并且我希望它实现IFoo
的两个版本,我必须定义一个版本的Baz
,该版本将泛型传递给IFoo
,而另一个版本则不会。例如:
public class Baz<T> : IFoo<T> { private IFoo<T> _command; public void Bar(T value) { _command.Bar(value); } }
public class Baz : IFoo { private IFoo _command; public void Bar() { _command.Bar(); } }
这两个类Baz
相当相似。它们都向另一个IFoo
对象传递函数调用。但由于一个接受一个参数,而另一个不接受,它们必须是两个不同的类,尽管它们的功能几乎相同。无论我对其中一个做出什么改变,我都保证会对另一个做出改变。理想的情况是有一个类Baz
,它可以使用或不使用泛型来实例化,这取决于它要采用的参数类型,以及它是否应该采用一个参数。
// This code works with the two versions of Baz defined above. // The goal would be to get this code to work with only one Baz class. var intBaz = new Baz<int>(); var stringBaz = new Baz<string>(); var emptyBaz = new Baz(); intBaz.Bar(100); stringBaz.Bar("It would be really nice if this is possible, thank you"); emptyBaz.Bar();
无论如何,在C#中,是否有定义一个接口IFoo
,它不仅决定其方法Bar
接受什么类型的参数,而且还决定Bar
是否接受任何参数?谢谢
到目前为止,我已经能够通过实现两个几乎相同的接口IFoo
和IFoo<T>
来解决这个问题。这在一定程度上“有效”,但使实现IFoo
和IFoo<T>
的类难以维护,因为任何实现一个的类都需要实现另一个的第二个类。对一个类的更改必须反映在对另一类的更改中。充其量,这为开发增加了时间。最坏的情况是,这会导致代码不同步。