我有两个类:
public class Question : IDisposable, IEquatable<Question>
{
}
public class SessionQuestion : Question, IDisposable, IEquatable<SessionQuestion>
{
}
Question
继承了 IDisposable
和 IEquatable
接口,那么 SessionQuestion
会不会隐式地继承那些接口呢?
我有两个类:
public class Question : IDisposable, IEquatable<Question>
{
}
public class SessionQuestion : Question, IDisposable, IEquatable<SessionQuestion>
{
}
Question
继承了 IDisposable
和 IEquatable
接口,那么 SessionQuestion
会不会隐式地继承那些接口呢?
public interface IMyInterface
{
void foo();
}
public class A : IMyInterface
{
public void foo()
{
Console.Out.WriteLine("A.foo() executed");
}
}
public class B : A, IMyInterface
{
void IMyInterface.foo()
{
Console.Out.WriteLine("B.foo() executed");
}
}
由于B希望将foo()方法作为显式接口实现,因此在其类定义中必须指定IMyInterface接口--即使类A已经实现了该接口。在这种情况下,从基类继承接口声明是不够的。
如果B类没有显式接口实现,则B类不需要再次指定接口(在这个小例子中是IMyInterface)。
从基类继承接口并具有某些接口成员的显式接口实现可能会导致令人惊讶的效果,最坏的情况下可能会导致损坏/错误的软件。
如果您执行以下代码序列:
A obj = new A();
obj.foo();
IMyInterface x = obj;
x.foo();
输出结果将会是
执行 A.foo()
执行 A.foo()
然而,现在让我们使用一个类型为 B 的对象,但是保持代码完全相同:
B obj = new B();
obj.foo();
IMyInterface x = obj;
x.foo();
Question
中已经实现了它们,那么你当然不需要在SessionQuestion
中再次实现它们。当然,你仍需要实现接口定义的所有成员。然而,如果基类包含与接口成员匹配的成员,则基类成员可以作为接口成员的实现工作,你无需手动再次实现它。
SessionQuestion s = new SessionQuestion();
然后if (s is IDisposable)
。 - dmeglioIEquatable<Question>
接口。但是,SessionQuestion 还实现了与IEquatable<Question>
不同的IEquatable<SessionQuestion>
接口。因此,您可以省略对 SessionQuestion 的 IDisposable 接口进行说明(它已经被从 Question 继承),但需要保留IEquatable<SessionQuestion>
(因为 Question 没有实现这个接口)。 - user2819245IEquatable<>
可能是一个不好的主意。更多详情请参见 Should IEquatable<T>, IComparable<T> be implemented on non-sealed classes?。 - Jeppe Stig Nielsen