直接实现接口和通过另一个接口实现接口有什么区别吗?

时间:2015-11-05 23:35:00

标签: c# inheritance interface multiple-inheritance

也就是说,如果我有接口:

public interface Foo { }

public interface Bar { }

public interface Baz : Foo, Bar { }

我有一个班级Qux,会不会有任何代码(除了基于确切界面的反射,或者由于一个版本没有实现{{1根据if Baz是否被声明为:

,这将起到不同的作用
Qux

与此相比?

public class Qux : Foo, Bar { }

1 个答案:

答案 0 :(得分: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"; } }

Foo.FooMethod Qux的映射仍为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本身是否已实施。

换句话说,如果你从不使用Baz界面本身,我找不到任何区别。