【问题标题】:Inherited Interfaces In C#C#中的继承接口
【发布时间】:2013-10-04 13:45:42
【问题描述】:

c 中的抽象方法必须由子类实现。所以我的问题是,当一个接口继承另一个接口时,为什么它不实现所有基本接口成员。

public interface IShape
{
  void Points();
}
public interface ICircle: IShape
{
  void IsDrawAble();
}

当我在 Visual Studio 2010 中运行此程序时,没有出现错误。根据定义,ICircle 必须实现 Points 功能。

谢谢

【问题讨论】:

  • 接口没有任何实现。
  • Abstract 类也可以避免接口实现。您只需要声明方法并标记它们abstract
  • 接口不是一个类。称之为类遵守的契约。
  • 不要把接口继承当成继承。 (我希望规范选择了一个不同的词。)将其视为“实现此接口的结构或类也需要实现该接口”。

标签: c# inheritance interface


【解决方案1】:

接口不实现任何东西

接口只包含具体类需要实现的成员列表。
重新声明基接口已经需要的成员是没有意义的。

同样,继承另一个abstract 类(或接口)的abstract 类不需要实现其任何方法。

【讨论】:

  • 挑剔点:即使是抽象类也必须提供其所有接口成员的实现,但允许抽象类提供抽象实现。也就是说,interface I { void M(); } abstract class C : I {} 是非法的,但abstract class C : I { public abstract void M(); } 是合法的。
  • @EricLippert:谢谢;我依稀记得。为什么,顺便说一句?
  • @SLaks:如果一个类声称要实现一个接口,.NET 要求每个接口成员都必须映射到该类的一个成员。如果 C# 隐式声明一个公共抽象虚拟方法,这将强制派生类公开其实现。如果要声明一个受保护的抽象虚方法,那将阻止派生类公开其实现。
【解决方案2】:

当您实现ICircle 时,您还需要实现Points()。以下代码无法编译:

class MyClass : ICircle
{
    void IsDrawAble() { }
}

所以您所说的应该是:“根据定义,ICircle 的所有实现也必须实现 IShape 成员”

【讨论】:

  • 它确实编译了这就是我问这个问题的原因,因为根据定义,ICircle 必须实现 Points 但它没有实现,VS 也没有抛出任何错误。但我只是明白,如果所有接口都实现基类方法而不是实现该接口的类将实现相同的方法两次。
  • 接口单独编译;我的示例与您的接口相结合无法编译。 ICircle : IShape 意味着任何实现ICircle 的人也必须实现IShape
【解决方案3】:

你自己回答了这个问题。 因为它是一个界面。接口不是类,因此它们不必(实际上不能)实现它们继承的其他接口。

【讨论】:

    【解决方案4】:

    当您在接口之间创建这种层次结构时,您正在定义谁实现Circle 接口也将实现IShape。因此,对于示例:

    public class Test : ICircle
    {
       public void Points()
       {
          // some code
       }
    
       public void IsDrawAble()
       {
          // some code
       }
    
    }
    

    使用它:

    ICircle obj = new Test();
    obj.Points();
    obj.IsDrawAble();
    

    IShape obj = new Test();
    obj.Points();
    

    【讨论】:

      【解决方案5】:

      一个接口代表一个合约。它们仅包含方法、属性、事件或索引器的签名。接口根本没有实现。实现接口的类/结构必须实现接口定义中指定的接口成员。

      您创建的层次结构仅仅意味着实现ICircle 接口的任何东西也实现了IShape 接口。

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 2023-03-04
        • 2011-03-24
        • 1970-01-01
        • 2023-03-14
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多