2

ここには独特の問題/状況があります。できるだけシンプルにしようとしています。私は、基本クラス (Parent など) と、基本クラス (Parent) から直接派生する一連の派生クラス (Child1、Child2 ..ChildN など) を持っています。基本クラスを変更し、「AVeryPrivilegedMethod」を追加します。これは、Child2 と Child3 にのみアクセスでき、他の子にはアクセスできません (または、将来、Child5 も将来的に最小限の変更で使用できるように構成可能にします)。この法案に適合するデザイン パターン/アーキテクチャ パターンはどれですか?

使用言語 - C#。

PS: InternalVisibleToを使用することを考えていましたが、これがアセンブリ レベルで適用されることに気付きました

4

7 に答える 7

4

これが「デザインパターン」と何の関係があるのか​​わかりません。言語機能の問題です。C#には、この種の選択と選択のカプセル化を簡単に実行できる言語機能がありません。

あなたの選択肢は、階層に新しいクラスを挿入し、BaseWithExtrasから派生しBase、一部の子をから派生さBaseせ、他の子をから派生させるかBaseWithExtras、それについて心配するのをやめて、すべての派生クラスでメソッドを使用できるようにすることだと思います。

于 2011-07-11T17:22:28.633 に答える
4

継承しているが、そこから派生している別の抽象クラス(より良い名前が必要なため)が欠落しているように聞こえます。SpecialChildParentChild2Child3

                    Parent
                      | 
   |------------------|------------|----------|
Child1            SpecialChild   Child4    Child5
                      |
         |---------------------|
      Child2                 Child3

この質問を自問してみてください。彼らは自分たちで共通の行動を共有しているが、他のすべての子供たちとは異なる行動をしているという点で、何が違うのでしょうかChild2。その動作をモデル化し、質問で示した例では、を実装する場所になります。Child3SpecialChildAVeryPrivilegedMethod

于 2011-07-11T17:24:23.127 に答える
3

別のレベルの抽象化を行いたいと思うでしょう:

public class Parent { }
public class MethodContainer : Parent { public void SomeMethod() { } }

次に、各子クラスは適切なクラスを継承します。

// Does not have method
public class ChildA : Parent

// Has Method
public class ChildB: MethodContainer
于 2011-07-11T17:23:19.747 に答える
0

依存性注入との古き良き関連付けについてはどうですか (必要に応じて後で変更して、他のクラスが関数にアクセスできるようにすることができます)。

public class Parent {
   private PrivilegedFunctions p;
   public Parent(PrivilegedFunctions inP) { p = inP; }
}

public interface PrivilegedFunctions {
   void SomeFuncHere();
}

public class AllowPrivileges : PrivilegedFunctions {
   public void AllowPrivileges () { }

   public void SomeFuncHere()
   { 
      // Actual implementation
   }
}

public class NoPrivileges : PrivilegedFunctions {
   public void NoPrivileges () { }

   public void SomeFuncHere()
   { 
      // No implementation
   }
}

public class Child1 : Parent {
   public Child1(PrivilegedFunctions inP) : base(inP) { }
}

次に、子に応じて、AllowPrivilegesまたはNoPrivilegesバージョンを注入できます。

// Child with privileges
Child1 with_priv = new Child1(new AllowPrivileges());
with_priv.SomeFuncHere(); // Does privileged operation
// Child without privileges
Child1 without_priv = new Child1(new NoPrivileges());
without_priv.SomeFuncHere(); // Does nothing
于 2011-07-11T17:29:10.687 に答える
0

基本クラスにしかアクセスできない場合は、基本メソッドでクラスの型にリフレクションを使用し、基本メソッドを正しく使用したいクラスのみを許可することをお勧めします。そうではなく、階層または派生クラスを変更できる場合は、ベースから派生した別のクラスを作成して、目的のメソッドを公開し、そこからクラスを派生させます。

于 2011-07-11T17:26:37.297 に答える
0

これは標準レベルの保護ではないため、おそらく適切なオプションはありません。ここに1つのオプションがあります

 class Parent
 {
       private void AVeryPrivilegedMethod() {}
       public static void AVeryPrivilegedMethod(Child2 c) { ((Parent)c).AVeryPrivilegedMethod(); }
       public static void AVeryPrivilegedMethod(Child3 c) { ((Parent)c).AVeryPrivilegedMethod(); }
 }

後で、次のように呼び出します。

 Child2 c = new Child2();
 Parent.AVeryPrivilegedMethod(c);

これは、コンパイラのチェックが必要であり (実行時にリフレクションを使用して Child2 と Child3 をチェックしない)、何らかの理由で指定した階層が必要であると想定しています。新しいレベルのサブクラスを提案する他の回答があります。これは、状況に応じて最適な回答になる可能性があります。そうでない場合は、これが役立つ場合があります。

于 2011-07-11T17:26:59.257 に答える
0

これらのメソッドが、継承階層に含まれる特定の子クラスでのみ使用される場合は、良い考えとは思えません。ここで達成したいのは実装の再利用であるため、依存性注入による構成は良い考えですが、そのメソッドをクラス インターフェイスの一部として公開する必要がある場合は、Mixin (C# で可能であれば) が最適でした。行く。

于 2011-12-13T13:22:16.010 に答える