从二次派生函数访问基类函数

时间:2018-07-14 01:32:10

标签: c# abstract-class multiple-inheritance

I seriously hope my title is clear enough. If it's not I'm happy to have better suggestions.

The situation is thus (variable types are just examples):

    public abstract class A
    {
      public virtual string X(string arg)
      {
        return "blarg";
      }
    }

    public class CommonProperties : A
    {
      public string foof { get; set;} = "widget";
      public string yay { get; set; }

      public override string X(string arg)
      {
        return base.X(arg);
      }
    }

    public class B : CommonProperties
    {
      public string UniqueProperty1 { get; set; }

      public override string X(string arg)
      {
        return base.X(arg);
      }
    }

    public class C : CommonProperties
    {
      public string UniqueProperty2 { get; set; }

      public override string X(string arg)
      {
        return base.X(arg);
      }
    }

class D : A
{
  public override string X(string arg)
      {
        return base.X(arg);
      }
    }
}

我正在概括我的问题。这不是我的实际代码。

问题在于C#不允许抽象类进行多重继承,接口也不允许使用默认代码(尚未),也不允许默认的初始化程序。

我希望CommonProperties可以从抽象类派生,而从 it 派生的类(类B和C)则可以直接访问原始抽象类对X函数的实现,而不是其最主要的CommonProperties实现。我试过做base.base.X(arg),但是没有用。下一个最佳方法是让类B和C分别从类A 的CommonProperties派生,但是C#不允许这样做。使A类成为接口是行不通的,因为我派生了许多类,这意味着我必须将所需的代码复制到每个类中。单。一。由于对默认值的限制,我无法使CommonProperties成为接口。我可以将通用属性移到它们的派生类中,但这会破坏代码重用(随着时间的推移,我可能需要添加其他属性,这意味着更新会更慢,更容易出错,等等)。

我等不及C#8.0(理论上)具有默认的函数实现。如果我可以让B和C直接访问CommonProperties.X()函数隐藏的A.X()函数,那将是一个很好的解决方法。我怀疑通过反射可以实现后一种解决方案(实际上,在我的项目中,A类正在这样做,因此对我来说主题并不困难),但是我想知道是否还有更直接的方法。 >

编辑:添加一个以上的类来更好地阐明问题。我忘记了CommonProperties应该从A继承,也表明 other 类直接从A继承。

1 个答案:

答案 0 :(得分:1)

您需要向类A添加一个非虚拟方法来调用A.X实现。方法名称包括类名称,我使用双下划线将方法名称和类名称分开。

public abstract class A
{
  public virtual string X(string arg)
  {
    return "blarg";
  }
  public string X__A(string arg)
  {
    return X(arg);
  }
}

public class CommonProperties : A
{
  public string foof { get; set;} = "widget";
  public string yay { get; set; }

  public override string X(string arg)
  {
    return "comarg";
  }
}

public class B : CommonProperties
{
  public string UniqueProperty1 { get; set; }

  public override string X(string arg)
  {
    return X__A(arg);
  }
}