当您使用相同的方法实现两个接口时,您如何知道调用哪个接口?

时间:2011-05-17 20:36:51

标签: c# interface

如果您在接口I1和I2以及以下类

中有TheMethod()
class TheClass : I1, I2
{
    void TheMethod()
}

如果某事实例化TheClass,它如何知道它正在使用哪个界面?

9 个答案:

答案 0 :(得分:7)

如果这就是客户端代码使用该类的方式,那并不重要。如果它需要做一些特定于接口的东西,它应该声明它需要的接口,并将类分配给它。例如。

I1 i = new TheClass()
i.TheMethod();

当然,使用您当前的实现TheClass,将i声明为I1I2并不重要,因为您只有一个实现。

如果你想为每个接口单独实现,那么你需要创建显式实现......

    void I1.TheMethod()
    {
        Console.WriteLine("I1");
    }

    void I2.TheMethod()
    {
        Console.WriteLine("I2");
    }

但请记住,显式实现不能公开。您可以明确地实现一个,并将另一个保留为可以公开的默认值。

    void I1.TheMethod()
    {
        Console.WriteLine("I1");
    }

    public void TheMethod()
    {
        Console.WriteLine("Default");
    }

查看the msdn article了解更多详情。

答案 1 :(得分:5)

如果两个方法都是公共的,则无论调用哪个接口,都将调用相同的方法。如果您需要更多粒度,则需要使用显式接口实现:

class TheClass : I1, I2
{
    void I1.TheMethod() {}
    void I2.TheMethod() {}
}

用法可能如下:

TheClass theClass = new TheClass();
I1 i1 = theClass;
I2 i2 = theClass;

i1.TheMethod();  // (calls the first one)
i2.TheMethod();  // (calls the other one)

要记住的一件事是,如果您将两个实现都显式化,那么您将无法再对声明为TheMethod的变量调用TheClass

theClass.TheMethod();   // This would fail since the method can only be called on the interface

当然,如果您愿意,您可以只显示其中一个实现,并保持另一个实现公开,在这种情况下,针对TheClass的调用将调用公共版本。

答案 2 :(得分:3)

在调用它时,您不使用接口。接口只是一个合约,用于定义您可以调用的方法。你总是打电话给实现。

答案 3 :(得分:2)

如果您实例化该类,那么您没有使用任何接口。如果将引用转换为任一接口,则表示您正在使用该接口。例如:

TheClass c = new TheClass();
c.TheMethod(); // using the class

I1 i = new TheClass();
i.TheMethod(); // using the I1 interface

声明您的类时,两个接口都将使用相同的方法。您还可以为类和单独的接口指定方法:

class TheClass : I1, I2
{
  void TheMethod() {} // used by the class
  void I1.TheMethod() {} // used by the I1 interface
  void I2.TheMethod() {} // used by the I2 interface
}

如果只指定接口的方法,除非先将引用转换为接口,否则无法访问该方法:

class TheClass : I1, I2
{
  void I1.TheMethod() {} // used by the I1 interface
  void I2.TheMethod() {} // used by the I2 interface
}

如果仅为某些接口指定单独的方法,则其他接口将使用与该类相同的实现:

class TheClass : I1, I2
{
  void TheMethod() {} // used by the class and the I1 interface
  void I2.TheMethod() {} // used by the I2 interface
}

答案 4 :(得分:1)

只要方法签名相同,实现两个或多个接口的方法的方法就完全合法。

没有办法知道“通过哪个接口”调用一个方法 - 没有这样的概念(并不重要)。

答案 5 :(得分:0)

真正的问题是,“谁在乎它正在使用哪个界面?”真的,它根本不是“使用”界面。它正在使用实现来实现接口。

答案 6 :(得分:0)

这无关紧要。转换到任何接口将导致调用该方法,但由于接口不能包含代码,因此无法从中继承行为。

答案 7 :(得分:0)

public interface IA
{
   void Sum();
}

public interface IB
{
    void Sum();
}

public class SumC : IA, IB
{
   void IA.Sum()
    {
        Console.WriteLine("IA");
    }

   void IB.Sum()
   {
       Console.WriteLine("IB");
   }
  public void Sum()
   {
       Console.WriteLine("Default");
   }
}

public class MainClass
{
    static void Main()
    {
        IA objIA = new SumC();
        IB objIB = new SumC();
        SumC objC = new SumC();

        objIA.Sum();
        objIB.Sum();
        objC.Sum();

        Console.ReadLine();
    }
}

答案 8 :(得分:0)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPattern
{
    interface IEmployee
    {
        void show();
    }
    interface IContarctEmployee
    {
        void show();
    }
    class Employee: IEmployee, IContarctEmployee
    {
       void IEmployee.show()
        {
            Console.WriteLine("Show Method is calling for Employee");
        }
        void IContarctEmployee.show()
        {
            Console.WriteLine("Show Method is calling for contract Employee");
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            IEmployee cmp = new Employee();
            IContarctEmployee ice = new Employee();
            cmp.show();
            ice.show();
        }
    }
}