2015-11-05 41 views
-2

也就是说,如果我有接口:直接实现接口并通过另一接口实现它有什么区别吗?

public interface Foo { } 

public interface Bar { } 

public interface Baz : Foo, Bar { } 

而且我有一个类Qux,会有任何代码(除基于完全相同的接口反射,或东西,不会因为一个版本的工作没有实现Baz),将功能不同,这取决于是否Qux被宣布是这样的:

public class Qux : Foo, Bar { } 

与此?

public class Qux : Baz { } 
+0

我认为你设法排除了你的“除了”部分之外的两者之间几乎所有可能的差异,而没有这样做的意义。你可以编辑它来更具体地解释你已经意识到哪些差异? – hvd

+0

@ hvd我知道'Qux'没有实现'Baz',我知道'Type.GetInterfaces()'会有所不同。 – AlphaModder

+0

“功能不同”如何?就界面成员的实施方式而言,这两种选择显然完全不同。在某些方面,这会导致代码实际执行时出现不同的“功能”。另一方面,接口的全部要点是,对象可以被视为接口而不是它自己的类型,在这方面,实现来自何处并不重要。另一方面,'Baz'可能会实现不同于'Qux'的接口,所以我们又回到了它们的不同之处。这很难说清楚你在问什么。 –

回答

2

我不知道除了明显的Baz没有实施之外的相关差异。

在C#规范(我看C#4.0节13.4,但仍然应该对新版本真),它说:

类或结构直接还直接实现一个接口隐式地实现了所有接口的基础接口。即使类或结构未明确列出基类列表中的所有基接口,情况也是如此。

这意味着下面的定义是等价的:

public class Qux : Baz {} 
public class Qux : Baz, Foo, Bar {} 

它甚至可以让你明确地实现Foo接口的方法,即使它没有明确列为基本接口:

public interface Foo { void FooMethod(); } 
public interface Bar { void BarMethod(); } 
public interface Baz : Foo, Bar { } 
public class Qux : Baz 
{ 
    void Foo.FooMethod() { } // legal 
    public void BarMethod() { } 
} 

所以所有的差异应该只与Baz接口有关。

差异如果Baz是一个基类,而不是一个接口。除非明确重新实现接口,否则13.4.5节和13.4.6节声明派生类不会更改接口映射。例如:

public interface Foo { string FooMethod(); } 
public class Baz : Foo { public string FooMethod() { return "Baz"; } } 
public class Qux : Baz { public new string FooMethod() { return "Qux"; } } 

QuxFoo.FooMethod的映射仍然是Baz.FooMethod

Foo x = new Qux(); 
x.FooMethod(); // returns "Baz" 

但是,如果你不是做...

public class Qux : Baz, Foo { ... } 

...这将重新实现接口和x.FooMethod()将返回“Qux”。

值得一提的是,如果你将两者结合起来,如...

public interface Baz : Foo, Bar {} 
public class QuxBase : Baz {} 
public class Qux : QuxBase, Baz {} 

...然后Qux仍将充当如果它被定义为public class Qux : QuxBase, Baz, Foo, Bar

当一个类实现一个接口,它也隐含地实现所有接口的基本接口。同样,接口的重新实现也隐含地重新实现了所有接口的基本接口。

因此,即使在这种情况下,实施Baz和实施Foo, Bar之间的唯一区别是本身是否Baz实现。

换句话说,如果你从来没有使用接口本身,我可以找到没有区别。