我有两个名为Family和Member的课程。成员来自家庭。我还有一个名为IDatabase的接口。 Family和Member类都实现了IDatabase。这会产生编译错误吗?
为了澄清,我们假设IDatabase有3种方法:添加,更新和删除。如果两个类都实现了这个接口,那么编译器是否会抛出错误,因为这两个类都包含具有相同名称的方法?
答案 0 :(得分:2)
是的,它将编译,但派生类将隐藏(不覆盖)基类的成员(除非您明确使用,否则编译器会警告您new
关键字)。
您可以使用这个简单的程序来查看会发生什么:
void Main()
{
IEntity e1 = new Base();
IEntity e2 = new Derived();
Base b1 = new Base();
Base b2 = new Derived();
Derived d = new Derived();
e1.Test();
e2.Test();
b1.Test();
b2.Test();
d.Test();
}
public class Base : IEntity
{
public void Test()
{
Console.WriteLine("Base");
}
}
public class Derived: Base, IEntity
{
public void Test()
{
Console.WriteLine("Derived");
}
}
// Define other methods and classes here
public interface IEntity
{
void Test();
}
您获得的输出(添加了解释)是:
Base (will call base member)
Derived (will call derived member)
Base (will call base member)
Base (will call base member since the variable is the base type)
Derived (will call derived member)
这里是派生类中实现接口的不同之处。试试这个:
((IEntity)d).Test();
这将输出Derived
_if Derived
实现IEntity
。如果Derived
不实现IEntity
,则编译器将绑定到 base 类方法,即使Derived
实现{{1}也是。这强调Test
隐藏接口方法而不是重新实现它。
答案 1 :(得分:1)
将虚拟放在基类的实现上,并覆盖特定类的实现
e.g。
public interface
{
void MyMethod();
}
public class MyBaseClass : IMyInterface
{
public virtual void MyMethod()
{
}
}
public class MyInhertingClass : MyBaseClass
{
public override void MyMethod()
{
}
}