1

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

4 に答える 4

7

基本クラスのコンストラクターのロジックを派生クラスで実行する場合は、通常、それを呼び出すだけです。

 public Derived(...) : base(...)
 {
     // ...
 }

基本クラスは、コンストラクター中に抽象/仮想メソッドを呼び出すことができますが、派生クラスのコンストラクター本体がまだ実行されていないため、一般的に嫌われています。(これは非常に強調して文書化する必要があります。)

これはあなたの質問に答えていますか?問題を理解しているかどうかは完全にはわかりません-いくつかの疑似コードが役立ちます。

編集:派生クラスコンストラクターを実装する必要があります。コンストラクターは継承されません。コンストラクターを指定しない場合、コンパイラーは、パラメーターなしの基本コンストラクターを呼び出すパラメーターなしのコンストラクターを提供します。ただし、同じシグネチャを使用してコンストラクターを簡単に作成し、基本クラスのコンストラクターを呼び出すだけです。

public Derived(string x) : base(x)
{
    // Base constructor will do all the work
}
于 2009-04-01T11:25:43.913 に答える
2

基本クラスのコンストラクターを提供し、派生クラスで使用します。

abstract class Base {
     // ...
     protected Base(string commonField) {
        CommonField = commonField;
     }
}

class Derived1 : Base {
     public Derived1(string commonField, string specificField) : base(commonField) {
        SpecificField = specificField;
     }
}
于 2009-04-01T11:26:05.347 に答える