多态性和接口

时间:2010-05-17 17:19:08

标签: polymorphism overloading

如果我有两个类x和y,则都扩展类w。和x实现接口z。如果我有方法doSomething(w object)和doSomething(x object),如果我调用doSomething(x)会发生什么?

编辑: 我在java上实现这个,更具体地说是在android上实现。 我问这个是因为一些实现特定接口的类在调用doSomething()时主要做同样的事情。但是有一些特殊情况我想借鉴。

4 个答案:

答案 0 :(得分:2)

这取决于您使用的语言。

例如,在C#中,它将使用doSomething(x object)而不是doSomething(w object)。

但是,如果你将它转换为w,那么它将使用doSomething(w object),如下所示:

doSomething((w) someObjectOfX);

doSomething(someObjectOfX as w);

答案 1 :(得分:1)

假设你有

w object1 = new x();
x object2 = new x();

传递object1将执行doSomething(w object)并传递object2 doSomething(x object)

P.S:当然取决于语言(谈到C#)

P.P.S:添加参数名称以使其更清晰

答案 2 :(得分:1)

在C#中,编译器将根据声明的变量类型选择正确的方法,而不是存储在其中的实际类型。

注意,下面的代码将W声明为一个类,并构造它的实例。如果您使W成为接口,并删除其声明和构造,则xy的行为将与下面的程序,{{1}的接口或类相同在这种情况下无所谓。

让我告诉你差异:

W

这里我声明了三个变量,类型为using System; namespace SO2851194 { class W { } class X : W { } class Y : W { } class Program { static void Main() { W w = new W(); X x = new X(); Y y = new Y(); doSomething(w); doSomething(x); doSomething(y); } static void doSomething(W w) { Console.Out.WriteLine("w"); } static void doSomething(X x) { Console.Out.WriteLine("x"); } } } WX,并且调用Y逐个传递这三个变量。该计划的输出是:

doSomething

正如预期的那样,编译器将选择具有最佳拟合参数类型的方法,并且在w x w 变量的情况下,它具有可以采用类型x的对象的方法。

但是,由于类继承,我们可以更改变量的声明,但保持构造对象类型,所以更改代码如下:

X

现在输出:

W w = new W();
W x = new X();   // Notice, changed variable type to W
W y = new Y();   // but keep constructing X and Y

因此w w w 变量包含类型为x的对象的事实没有考虑到它,编译器从变量类型而不是其内容中选择了方法。

在C#4.0中,您现在拥有X类型,因此再次将代码更改为:

dynamic

再次输出:

dynamic w = new W();
dynamic x = new X();
dynamic y = new Y();

现在编译器推迟选择任何方法直到运行时,并且在运行时,它看到名为w x w 的变量实际上包含类型为x的对象,然后选择具有最佳的方法拟合参数类型。

答案 3 :(得分:-2)

您不能使用相同签名的两种不同方法。它的模糊代码,编译器不会编译和解释器会抛出错误。