为构造函数实现策略

时间:2009-04-01 11:22:18

标签: c# constructor strategy-pattern

在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.

4 个答案:

答案 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. 解析基类中的数据并使用受保护的基本属性将其传递给子级。
  2. 在调用构造函数之前解析数据。
  3. 解析数据而非使用。
  4. <强> 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
         }
    }