这有助于理解为什么这是非法的。你想要的功能是形式参数类型协方差,很少有语言提供它。 (艾菲尔,我认为这是一个功能。)它在语言中不常见,因为它不安全!让我用一个例子来说明:
class Animal {}
class Lion : Animal { public void Roar() { } }
class Giraffe : Animal { }
interface IFoo { void M(Animal a); }
class C : IFoo
{
public void M(Lion lion) { lion.Roar(); }
}
class P
{
public static void Main()
{
IFoo foo = new C();
foo.M(new Giraffe());
}
}
而我们只是做了长颈鹿的咆哮。
如果你看看所有这些类型的转换,唯一可以明显违法的是匹配C.M(Giraffe)
到IFoo.M(Animal)
。
现在,正式参数类型逆变是类型安全但它不是在C#中的法律除了在某些非常有限的情况下。如果C#支持它,它没有,那么你可以放心地做这样的事情:
interface IBar { void M(Giraffe g); }
class D : IBar
{
public void M(Animal animal) { ... }
}
class P
{
public static void Main()
{
IBar bar = new D();
bar.M(new Giraffe());
}
}
看看发生了什么呢? IFoo.M说:“我可以带长颈鹿”,C.M说:“我可以接受任何长颈鹿,因为实际上我可以接受任何动物”。如果C#支持它,那将是类型安全的,但它仅以两种方式支持它:
- 反变换泛型委托和接口转换。
- 将方法组转换为委托类型的方法组转换。
第一的一个例子是,IComparable<Animal>
类型的表达式可以由相同的逻辑被分配给IComparable<Giraffe>
类型的变量:比较两个动物在需要比较两个长颈鹿的方法,可以使用这样的方法。这是在C#4
所述第二的一个例子是加入:
delegate void MyFunction(Giraffe g);
...
D d = new D();
MyFunction myfunc = d.M;
再次,我们需要一个函数,一个长颈鹿,我们提供一个可以接收任意动物。此功能添加到C#2中。
您应该使接口本身具有通用性并为实现类提供所需的类型。 – Rik 2013-04-11 13:19:00
如何在print方法中不使用参数并使每个子类将IClass实现注入到构造器或Sertter中。 – 2013-04-11 13:19:35
toString方法继承自Object,所以为什么你真的需要'print(MyClass item)'而不是'print(Object item)'? 你隐藏这种方法吗? – Thomas 2013-04-11 13:19:49