是否扩展接口,当base class 已经扩展了同一个接口
Whether to extend interface, when base class already extends same interface
在C#中,如下代码片段所示,是不是在声明classA时correct/proper扩展接口IFoo,知道classBaseClass扩展了接口是不是?是否有必要在这里指定接口 IFoo,这是最佳实践吗?
class A : BaseClass, IFoo
{
}
这可能是一个愚蠢的问题,但在这种情况下什么是合适的做法?
如果 BaseClass 继承自 IFoo,则完全没有必要在 Class A 中使用 IFoo。
查看下图(Resharper用于此推荐)
特别感谢@InBetween
如果是接口重新实现,则在子 class 上重新定义接口有用例。
interface IFace
{
void Method1();
}
class Class1 : IFace
{
void IFace.Method1()
{
Console.WriteLine("I am calling you from Class1");
}
}
class Class2 : Class1, IFace
{
public void Method1()
{
Console.WriteLine("i am calling you from Class2");
}
}
int main void ()
{
IFace ins = new Class2();
ins.Method1();
}
这个方法returnsi am calling you from Class2
然而,
interface IFace
{
void Method1();
}
class Class1 : IFace
{
void IFace.Method1()
{
Console.WriteLine("I am calling you from Class1");
}
}
class Class2 : Class1
{
public void Method1()
{
Console.WriteLine("i am calling you from Class2");
}
}
int main void ()
{
IFace ins = new Class2();
ins.Method1();
}
returns I am calling you from Class1
虽然接受的答案在您的特定情况下是正确的,但情况并非总是如此。
在 class 声明中重新声明接口可能是有用且必要的:当您想要 重新实现 接口时。
考虑以下代码,仔细研究:
interface IFoo {
string Foo(); }
class A: IFoo {
public string Foo() { return "A"; } }
class B: A, IFoo {
}
class C: A {
new string Foo() { return "C"; } }
class D: A, IFoo {
string IFoo.Foo() { return "D"; } }
现在试着弄清楚以下代码将输出什么:
IFoo a = new A();
IFoo b = new B();
IFoo c = new C();
IFoo d = new D();
Console.WriteLine(a.Foo());
Console.WriteLine(b.Foo());
Console.WriteLine(c.Foo());
Console.WriteLine(d.Foo());
您现在知道重新声明接口(类型 D
)有何用处了吗?
此外,另一个要点是 MSDN 中的信息如何具有误导性,似乎暗示许多接口在很多 classes 中没有任何明显的原因被重新声明;例如,许多集合类型重新声明了无限数量的接口。
这确实不是真的,问题在于文档是建立在程序集的元数据之上的,而该工具无法真正辨别接口是否直接在类型中声明。此外,因为它的文档明确告诉您实现的接口,无论它们实际声明在哪里,即使它不是 100% 与源代码准确。
在C#中,如下代码片段所示,是不是在声明classA时correct/proper扩展接口IFoo,知道classBaseClass扩展了接口是不是?是否有必要在这里指定接口 IFoo,这是最佳实践吗?
class A : BaseClass, IFoo
{
}
这可能是一个愚蠢的问题,但在这种情况下什么是合适的做法?
如果 BaseClass 继承自 IFoo,则完全没有必要在 Class A 中使用 IFoo。
查看下图(Resharper用于此推荐)
特别感谢@InBetween
如果是接口重新实现,则在子 class 上重新定义接口有用例。
interface IFace
{
void Method1();
}
class Class1 : IFace
{
void IFace.Method1()
{
Console.WriteLine("I am calling you from Class1");
}
}
class Class2 : Class1, IFace
{
public void Method1()
{
Console.WriteLine("i am calling you from Class2");
}
}
int main void ()
{
IFace ins = new Class2();
ins.Method1();
}
这个方法returnsi am calling you from Class2
然而,
interface IFace
{
void Method1();
}
class Class1 : IFace
{
void IFace.Method1()
{
Console.WriteLine("I am calling you from Class1");
}
}
class Class2 : Class1
{
public void Method1()
{
Console.WriteLine("i am calling you from Class2");
}
}
int main void ()
{
IFace ins = new Class2();
ins.Method1();
}
returns I am calling you from Class1
虽然接受的答案在您的特定情况下是正确的,但情况并非总是如此。
在 class 声明中重新声明接口可能是有用且必要的:当您想要 重新实现 接口时。
考虑以下代码,仔细研究:
interface IFoo {
string Foo(); }
class A: IFoo {
public string Foo() { return "A"; } }
class B: A, IFoo {
}
class C: A {
new string Foo() { return "C"; } }
class D: A, IFoo {
string IFoo.Foo() { return "D"; } }
现在试着弄清楚以下代码将输出什么:
IFoo a = new A();
IFoo b = new B();
IFoo c = new C();
IFoo d = new D();
Console.WriteLine(a.Foo());
Console.WriteLine(b.Foo());
Console.WriteLine(c.Foo());
Console.WriteLine(d.Foo());
您现在知道重新声明接口(类型 D
)有何用处了吗?
此外,另一个要点是 MSDN 中的信息如何具有误导性,似乎暗示许多接口在很多 classes 中没有任何明显的原因被重新声明;例如,许多集合类型重新声明了无限数量的接口。
这确实不是真的,问题在于文档是建立在程序集的元数据之上的,而该工具无法真正辨别接口是否直接在类型中声明。此外,因为它的文档明确告诉您实现的接口,无论它们实际声明在哪里,即使它不是 100% 与源代码准确。