也就是说,如果我有接口:
public interface Foo { }
public interface Bar { }
public interface Baz : Foo, Bar { }
我有一个班级Qux
,会不会有任何代码(除了基于确切界面的反射,或者由于一个版本没有实现{{1根据if Baz
是否被声明为:
Qux
与此相比?
public class Qux : Foo, Bar { }
答案 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
界面本身,我找不到任何区别。