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

本文关键字:接口 实现 之间 另一个 什么 区别 一个 | 更新日期: 2023-09-27 18:20:41

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

public interface Foo { }
public interface Bar { }
public interface Baz : Foo, Bar { }

我有一个类Qux,是否有任何代码(除了基于确切接口的反射,或者因为一个版本没有实现Baz而无法工作的东西)会根据Qux是否被这样声明而起不同的作用:

public class Qux : Foo, Bar { }

与此相比?

public class Qux : Baz { }

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

除了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.FooMethodQux的映射仍然是Baz.FooMethod:

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

但如果你真的这么做了。。。

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

它将重新实现接口并且CCD_ 11将返回"Qux"。

值得注意的是,如果你将两者结合起来,比如…

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

则CCD_ 12仍将如同其被定义为CCD_

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

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

换句话说,如果您从不使用Baz接口本身,那么我找不到任何区别。