2012-03-26 13 views
1

コンストラクタを使用して派生クラスの保護されたメンバーを初期化したいが、base()を呼び出しているのでこのコールを呼び出すことができないので、 ":ベースコンストラクタの呼び出し時に初期化メソッドを再利用する

public class ABase 
    { 
     public object Param1 { get; set; } 
     public object Param2 { get; set; } 
     protected object Param3 { get; set; } 

     public ABase() 
      : this(null, null) 
     { } 

     public ABase(object param1) 
      : this(param1, null) 
     { } 

     public ABase(object param1, object param2) 
     { 
      Param1 = param1; 
      Param2 = param2; 
     } 
    } 

    public class A : ABase 
    { 
     public A() 
     { InitParam3(); } 

     public A(object param1) 
      : base(param1) 
     { InitParam3(); } 

     public A(object param1, object param2) 
      : base(param1, param2) 
     { InitParam3(); } 

     private void InitParam3() 
     { 
      Param3 = "param3"; 
     } 
    } 

すべてのコンストラクタでInitParam3()を呼び出すことを避ける方法はありますか?私はすべての変更を設計するために開いています。

+0

現在のソリューション(あなたのコード)は@lazyberezovsky答えより優れています。私のコメントを参照してください。 – Aliostad

+0

「すべてのコンストラクタでInitParam3()を呼び出さないようにする方法はありますか? –

+0

私は実際にあなたの両方に同意する必要がありますが、それぞれのソリューションには独自の欠点があります。 – misha

答えて

6

子クラスのコンストラクタチェーンを使用して、ベースクラスのコンストラクタのほとんどを呼び出します。

public class ABase 
     { 
      public object Param1 { get; set; } 
      public object Param2 { get; set; } 
      protected object Param3 { get; set; } 

      public ABase() 
       : this(null, null) 
      { } 

      public ABase(object param1) 
       : this(param1, null) 
      { } 

      public ABase(object param1, object param2) 
      { 
       Param1 = param1; 
       Param2 = param2; 
      } 
     } 

     public class A : ABase 
     { 
      public A() : this(null, null) 
      { } 

      public A(object param1) 
       : this(param1m, null) 
      { } 

      public A(object param1, object param2) 
       : base(param1, param2) 
      { InitParam3(); } 

      private void InitParam3() 
      { 
       Param3 = "param3"; 
      } 
     } 

UPDATE(削除デフォルト値の複製):

public abstract class ABase 
{ 
    protected const object DefaultParam1 = null; 
    protected const object DefaultParam2 = null; 

    public object Param1 {get;set;} 
    public object Param2 { get; set; } 
    protected object Param3 { get; set; } 

    public ABase(object param1 = DefaultParam1, object param2 = DefaultParam2) 
    { 
     Param1 = param1; 
     Param2 = param2; 
    } 
} 

public class A : ABase 
{ 
    public A(object param1 = DefaultParam1, object param2 = DefaultParam2) 
     : base(param1, param2) 
    { 
     Param3 = "param3"; 
    }  
} 
+1

このアプローチの問題は、派生クラスがスーパークラスのために残す必要がある間にスーパークラスがやっているのと同じ仮定をしているということです。スーパークラスは 'null'を使用して起動し、' null '以外の別のデフォルトを使用するように変更した場合は、2つの場所を変更する必要があります。 – Aliostad

+0

こんにちは、チップのおかげで。 – misha

+0

はい、保護されたパラメータの初期化の重複を削除する唯一の方法です。 –

1

これはOK溶液です。

lazyberezovskyのアプローチの問題は、派生クラスがスーパークラスのために残す必要がある間にパラメータのデフォルト値のための独自の前提を作っているということです。

スーパークラスは起動にnullを使用し、null以外の別のデフォルトを使用するように変更した場合、2つの場所を変更する必要があります。

私の場合、デフォルト値の決定は、小さな重複よりも重要です。

関連する問題