在C#中为模板/抽象类的构造函数实现策略的最佳方法是什么? 我有几个类都基于解析构造函数中的字符串。 解析是在静态方法中完成的,该方法创建键值对的列表,并且对于所有类都是通用的,但是某些字段对于所有类也是通用的 - 因此我使用抽象模板类。
问题是我没有看到继承抽象基类的构造函数实现的方法。否则,我会在基类中实现构造函数策略,并强制在一些抽象方法中处理列表。
编辑: 为模板类添加了不可用的代码
public abstract class XXXMessageTemplate
{
public XXXMessageTemplate(string x) // implementation for the constructor
{
Parse(x);//general parse function
CommonFields();//filling common properties
HandlePrivateProperties();//fill individual properties
HandlePrivateStructures();//fill individual structures
}
abstract void HandlePrivateProperties();
abstract void HandlePrivateStructures();
}
The actual messages should not implement any constructor and only implement the HandlePrivateProperties and HandlePrivateStructures functions.
答案 0 :(得分:7)
如果您希望基类构造函数的逻辑在派生类中运行,您通常只需调用它:
public Derived(...) : base(...)
{
// ...
}
基类可以在构造函数中调用抽象/虚方法,但由于派生类的构造函数体尚未执行,因此通常不赞成。 (你想要真正强调这一点。)
这是否回答了你的问题?我不完全确定我理解这个问题 - 一些伪代码会有所帮助。
编辑:派生类有来实现构造函数。构造函数不是继承的。如果未指定任何构造函数,编译器将提供无参数构造函数,该构造函数调用基本无参数构造函数。但是,您可以轻松编写具有相同签名的构造函数,并只调用基类构造函数:
public Derived(string x) : base(x)
{
// Base constructor will do all the work
}
答案 1 :(得分:2)
为基类提供构造函数并在派生类中使用它:
abstract class Base {
// ...
protected Base(string commonField) {
CommonField = commonField;
}
}
class Derived1 : Base {
public Derived1(string commonField, string specificField) : base(commonField) {
SpecificField = specificField;
}
}
答案 2 :(得分:1)
我不是100%确定我完全理解这个问题,但是你的意思是你希望你的子类将文字字符串传递给基础,如本例所示?
public class MyMessage : XXXMessageTemplate
{
public MyMessage() : base("MyMessage String")
{
}
public override void HandlePrivateProperties()
{
// ...
}
public override void HandlePrivateStructures()
{
// ...
}
}
答案 3 :(得分:1)
我可以看到问题出在Parse(...)方法中。不是在方法本身,而是在他的存在。您有一些原始数据(字符串x),在用于构造对象之前必须将其转换为结构化数据(键值对)。所以你需要以某种方式将结构化数据传递给基础和子构造函数。我看到了3种方法:
<强> 1 强> 您可以通过附加保护属性来扩展Mehrdad答案,该属性包含已解析的args。类似的东西:
abstract class Base {
protected ParsedData ParsedData;
// ...
protected Base(string x) {
ParsedData = Parse(x);
CommonFields(); //initialize common fields using ParsedData
}
}
class Derived1 : Base {
public Derived1(string x) : base(x) {
DerivedFields(); //initialize specific fields using ParsedData
}
}
<强> 2 强> 或者您可以将预解析后的字符串传递给构造函数:
abstract class Base {
protected ParsedData ParsedData;
// ...
public static ParsedData Parse(string x)
{
//Parse x here...
}
protected Base(ParsedData data) {
CommonFields(data); //initialize common fields using data
}
}
class Derived1 : Base {
public Derived1(ParsedData data) : base(data) {
DerivedFields(data); //initialize specific fields using data
}
}
第3 强> 或者用解析代替使用:
abstract class Base {
// ...
protected Base(string x) {
var data = Parse(x);
CommonFields(data); //initialize common fields using data
}
}
class Derived1 : Base {
public Derived1(string x) : base(x) {
var data = Parse(x);
DerivedFields(data); //initialize specific fields using data
}
}