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继承。
答案 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);
}
}