如果我有两个类x和y,则都扩展类w。和x实现接口z。如果我有方法doSomething(w object)和doSomething(x object),如果我调用doSomething(x)会发生什么?
编辑: 我在java上实现这个,更具体地说是在android上实现。 我问这个是因为一些实现特定接口的类在调用doSomething()时主要做同样的事情。但是有一些特殊情况我想借鉴。
答案 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.P.S:添加参数名称以使其更清晰
答案 2 :(得分:1)
在C#中,编译器将根据声明的变量类型选择正确的方法,而不是存储在其中的实际类型。
注意,下面的代码将W
声明为一个类,并构造它的实例。如果您使W
成为接口,并删除其声明和构造,则x
和y
的行为将与下面的程序,{{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");
}
}
}
,W
和X
,并且调用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)
您不能使用相同签名的两种不同方法。它的模糊代码,编译器不会编译和解释器会抛出错误。