将实施哪个界面?

时间:2010-09-12 12:11:15

标签: c# inheritance interface

我对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

4 个答案:

答案 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”