【问题标题】:How to Skip implementation of interface in class如何在类中跳过接口的实现
【发布时间】:2014-06-30 14:01:19
【问题描述】:

接口 - I1(包含 M1 方法) 类 - C1:I1(c1 实现 I1) 类 - C2:C1(C2 继承 C1)

interface I1
{
    void M1();
}
class C1 : I1
{
    void M1(){}
}
class C2 : C1
{
}

要求: “C1”中不应该有“M1”的实现,基本上“M1”需要在“C2”中实现

如何使用任何 OOP 概念来实现这一目标?

【问题讨论】:

  • 我已经为您的第一行添加了一个更易于理解的大纲 (IMO),如果您不认为这是可以接受的,请随时修改或还原

标签: c# oop interface


【解决方案1】:

只要你能容忍 C1 是抽象的,这就行了:

interface I1
{
    void M1();
}

abstract class C1 : I1
{
    public abstract void M1();
}

class C2 : C1
{
    public override void M1()
    {
        //
    }
}

编辑:正如 Isantipov 在评论中指出的那样,您可以避免这样的抽象类:

class C1 : I1
{
    public virtual void M1()
    {
        throw new NotSupportedException();
    }
}

【讨论】:

  • 如果你不能让 c1 抽象,你唯一能做的(除了改变你的架构以避免继承)是使 M1 垂直并在其 C1 实现中抛出 NotSupportedExcetion (msdn.microsoft.com/en-us/library/…) )
  • 谢谢大卫,明白了。
【解决方案2】:

C1抽象化并将M1定义为抽象方法。

【讨论】:

    【解决方案3】:

    您正在寻找摘要method[wiki]

    抽象方法是一种只有签名而没有实现的方法 身体。它通常用于指定子类必须提供 方法的实现。抽象方法用于指定 一些计算机语言的接口。

    Abstract methods in C#:

    抽象方法声明引入了一个新的虚方法,但是 不提供该方法的实现。反而, 非抽象派生类需要提供自己的 通过覆盖该方法来实现。因为抽象方法 不提供实际实现,抽象的方法体 方法只包含一个分号。

    在你的情况下:

    interface I1
    {
        void M1();
    }
    
    abstract class C1 : I1
    {
        public abstract void M1();
    }
    
    class C2 : C1
    {
        public override void M1()
        {
            // Your code here
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以使 C1 抽象化,也可以使用显式实现。这意味着它已实现,但不可见。

      class C1 : I1
      {
          void I1.M1(){ throw new NotImplementedException(); }
      }
      

      这样称呼是无效的:

      C1 c1 = new C1();
      c1.M1(); //Error
      

      【讨论】:

        【解决方案5】:

        另一种答案。
        你可以有多个接口。 .NET Fiddle

        interface I1 
        {
           void someCommonMethod();
        }
        
        interface I2 
        {
           void M1();
        }
        

        那么你的类就可以这样继承了。

        class C1 : I1
        {
            public void someCommonMethod()
            {
                ...
            }
        }
        
        class C2 : C1, I2
        {
            public void M1()
            {
                ...
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多