在面向对象理论中,派生类是否应该继承父对象的接口?

时间:2016-06-01 19:45:20

标签: java c# inheritance interface

我是一名自学成才的业余爱好者,我的所有知识都来自于看到编译器做什么和不喜欢什么。

假设我有(用C#表示法,Java可能有其他能力)

我需要覆盖的类看起来像这样:

public interface ICanDoSomethingElse
{
    void DoIt();
}
class Parent : ICanDoSomethingElse
{
   public void EatTacos()
   {
   }

   void ICanDoSomethingElse.DoIt(string thingToDo)
   {
      // Implementation
   }
}

所以我这样做:

class Child : Parent, ICanDoSomethingElse
{
   new public void EatTacos()
   {
   }
   void ICanDoSomethingElse.DoIt(string thingToDo) // NEW keyword illegal here? 
   {
      // Implementation
   }
}

问题

我发现 new 关键字在界面中是非法的。那是因为这是一个明确的界面吗?

有没有办法强制孩子实现一个接口,或者这只是意味着我需要设置一个隐式/显式转换?

2 个答案:

答案 0 :(得分:3)

  

我发现新关键字在界面中是非法的。那是因为这是一个明确的界面吗?

错误是因为您在类中明确地实现了接口。

显式实现仅在您直接使用接口而不是底层实现时强制公开方法。

如果你的课程是这样的:

class Parent : ICanDoSomethingElse
{
   ...

   public void DoIt(string thingToDo)
   {
      // Implementation
   }
}

class Child : Parent, ICanDoSomethingElse
{
   ...

   public new void DoIt(string thingToDo)
   {
      // Implementation
   }
}

您需要使用new关键字以某种方式隐藏Parent.DoIt实施。

  

有没有办法强迫孩子实现一个接口,或者这只是意味着我需要设置一个隐式/显式的演员?

您可以Parentabstract,然后是接口的方法abstract

abstract class Parent : ICanDoSomethingElse
{
   ...

   public abstract void DoIt(string thingToDo);
}

class Child : Parent, ICanDoSomethingElse
{
   ...

   public override void DoIt(string thingToDo)
   {
      // Implementation
   }
}

此处,Child必须实施DoIt方法。

答案 1 :(得分:0)

我认为您执行的interface实施与new关键字无关。

new关键字在从其父级继承的方法上定义新行为时正在使用

public class Parent{
    public void SayHello(){
        Console.WriteLine("Hello from parent");
    }    
}

和孩子一起

public class Child : Parent {
    public new void SayHello(){
        Console.WriteLine("Hello from child");
    }    
}

如果您想将界面用作实现,则无需使用new关键字