我对Interface有疑问。有2个接口都包含相同的Method Test()。 现在我继承了Sample类中的接口。我想知道将调用哪个接口的方法? 我的代码示例如下:
interface IA
{
void Test();
}
interface IB
{
void Test();
}
class Sample: IA, IB
{
public void Test()
{
Console.WriteLine("Which interface will be implemented IA or IB???!");
}
}
class Program
{
public static void Main(string[] args)
{
Sample t = new Sample();
t.Test();//Which Interface's Method will called.
Console.ReadLine();
}
}
由于 Vijendra Singh
答案 0 :(得分:12)
两者的结果都是一样的。如果您希望每个接口具有不同的行为,则必须明确实现它们:
interface IA
{
void Test();
}
interface IB
{
void Test();
}
class Sample: IA, IB
{
void IA.Test()
{
Console.WriteLine("Hi from IA");
}
void IB.Test()
{
Console.WriteLine("Hi from IB");
}
public void Test() //default implementation
{
Console.WriteLine("Hi from Sample");
}
}
class Program
{
public static void Main(string[] args)
{
Sample t = new Sample();
t.Test(); // "Hi from Sample"
((IA)t).Test(); // "Hi from IA"
((IB)t).Test(); // "Hi from IB"
Console.ReadLine();
}
}
如果您需要默认行为,请创建具有相同签名的方法(因此是隐式接口实现)并为该案例添加代码。通常,您只需要显式实现。
答案 1 :(得分:9)
两者。
如果你有代码
IA a = new Sample();
或
IB b = new Sample();
输出相同。
修改强>
调用什么界面?
两者已实施无。
存在接口,使程序员知道该类的方法(接口)。
您需要使用接口的具体实现。具体类的方法是被调用的方法。
答案 2 :(得分:3)
你正在考虑错误的界面。接口不是实现,它是一种抽象。
在告诉编译器Sample是IA和IB时,您只是简单地说它可以转换为这些类型中的任何一种,并且具有执行调用代码期望它能够执行的任何操作所需的所有功能。
即。在以下代码中
Sample sample = new Sample();
sample.Test();
IA a = sample;
a.Test();
IB b = sample;
b.Test();
它没有调用三个名为Test的独立方法,它每次都从Sample调用Test方法。这与
相反object obj = sample;
obj.Test();
即使obj有一个方法Test本质上是类型Sample,也无法编译。
当您将对象作为参数传递给另一个方法时,这尤其有用。
public void DoTest(IA a)
{
a.Test();
}
Sample sample = new Sample();
DoTest(sample);
在这种情况下,编译器只知道具有IA合同的任何东西都有一个Test方法。它不关心它是什么类型,这是调用代码的业务。
答案 3 :(得分:2)
你直接调用Sample.Test()方法,因为“t”变量被声明为“Sample t”