【问题标题】:Implementing Interfaces on Base classes and Derived classes in C# [closed]在 C# 中的基类和派生类上实现接口 [关闭]
【发布时间】:2014-09-12 01:53:13
【问题描述】:

我有 2 个班级,分别名为 Family 和 Member。成员来自家庭。我还有一个名为 IDatabase 的接口。 Family 和 Member 类都实现了 IDatabase。这会产生编译器错误吗?

为了澄清,假设 IDatabase 有 3 个方法:添加、更新和删除。如果两个类都实现了这个接口,编译器会不会因为两个类都包含同名的方法而抛出错误?

【问题讨论】:

  • 为什么不直接编译看看呢?
  • 编译器可以正常工作,但是说真的,你应该只编译并询问为什么你会得到一个你不期望的错误(如果你有一个错误,你不应该在这个案例)。
  • 你在说this之类的东西吗?这是语言的一个特性,称为接口重新实现。
  • 它不应该抛出错误,但如果你打算隐藏成员,它应该警告你使用“new”关键字。
  • 即使您没有直接访问 Visual Studio 的权限,也可以使用 Dot Net Fiddle Example 进行类似的测试。

标签: c# interface


【解决方案1】:

是的,它会编译,但是派生类会隐藏(而不是覆盖)基类的成员(编译器会警告你,除非你明确使用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也实现了Test。这强调Derived 隐藏接口方法而不是重新实现它。

【讨论】:

  • 大多数人认为将 IEntity 添加到派生类只是多余的,但实际上它会导致行为发生变化。在这种情况下,删除它会导致输出中的第二行为“Base”。
  • @mikez 正确,我在解释中添加了这个区别。
【解决方案2】:

将 virtual 放在基类的实现上并覆盖特定类的实现

例如

public interface
{
    void MyMethod();
}

public class MyBaseClass : IMyInterface
{
    public virtual void MyMethod()
    {
    }
}

public class MyInhertingClass : MyBaseClass
{
    public override void MyMethod()
    {
    }
}

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2011-05-08
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2012-03-14
    • 2013-09-30
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多