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


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(,但没有成功。下一个最好的方法是从类A类CommonProperties派生类B和C,但C#不允许这样做。将类A作为接口是不可行的,因为我有大量的类从它派生而来,这意味着我必须将所需的代码复制到每个类中。仅有一个的一由于对默认值的限制,我无法将CommonProperties作为接口。我可以将通用属性移动到它们的派生类中,但这会阻碍代码重用(随着时间的推移,我可能需要添加额外的属性,这意味着更新会更慢,更容易出错,等等(

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

编辑:增加一个类以更好地澄清问题。我忘记了CommonProperties应该从A继承,还显示其他类直接从A继承。

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

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

最新更新