从二次派生函数访问基础 class 函数

Accessing base class function from secondarily derived functions

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# 不允许抽象 classes 的多重继承,接口不允许默认代码(目前)也不允许默认初始化器。

我希望 CommonProperties 从抽象 class 派生,classes 从 it 派生(classes B和 C) 能够直接访问 X 函数的原始抽象 class 实现,而不是覆盖它的 CommonProperties 实现。我试过 base.base.X(arg) 但没有用。下一个最好的方法是让 classes B 和 C 从 class A and class CommonProperties 派生,但 C# 不允许这样做.使 class A 成为一个接口是行不通的,因为我有大量的 class 是从它派生出来的,这意味着我必须将需要的代码复制到每个接口中。单身的。一。由于对默认值的限制,我无法将 CommonProperties 设为接口。我可以将公共属性移动到它们派生的 classes 中,但这会破坏代码重用(我可能需要随着时间的推移添加额外的属性,这意味着更新会更慢并且更容易出错,等等)

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

编辑:再添加一个 class 以更好地阐明问题。我忘记了 CommonProperties 应该继承自 A 并且还显示 other classes 直接继承自 A.

您需要向 class A 添加一个调用 A.X 实现的非虚方法。方法名包含class名,我用双下划线分隔方法名和class名。

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);
  }
}