如果您在接口I1和I2以及以下类
中有TheMethod()
class TheClass : I1, I2
{
void TheMethod()
}
如果某事实例化TheClass
,它如何知道它正在使用哪个界面?
答案 0 :(得分:7)
如果这就是客户端代码使用该类的方式,那并不重要。如果它需要做一些特定于接口的东西,它应该声明它需要的接口,并将类分配给它。例如。
I1 i = new TheClass()
i.TheMethod();
当然,使用您当前的实现TheClass
,将i
声明为I1
或I2
并不重要,因为您只有一个实现。
如果你想为每个接口单独实现,那么你需要创建显式实现......
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();
}
}
}