C# 当我只希望一些派生类可以访问基类中的方法时,使用什么设计模式?

C# 当我只希望一些派生类可以访问基类中的方法时,使用什么设计模式?,c#,design-patterns,architectural-patterns,object-oriented-analysis,C#,Design Patterns,Architectural Patterns,Object Oriented Analysis,我这里有一个独特的问题/情况。试着让它尽可能简单。我有一个基类(比如父类)和一大堆直接从基类(父类)派生的派生类(比如Child1,Child2..ChildN)。我想更改基类并添加一个“AVeryPrivilegedMethod”,它只对Child2和Child3可访问,而对任何其他子级都不可访问(或者使其可配置,以便将来Child5也可以使用它,只需进行最小的更改)。什么样的设计模式/架构模式适合此账单 使用的语言-C# PS:我在考虑使用,但意识到这会应用于汇编级别我不明白这与“设计模式”

我这里有一个独特的问题/情况。试着让它尽可能简单。我有一个基类(比如父类)和一大堆直接从基类(父类)派生的派生类(比如Child1,Child2..ChildN)。我想更改基类并添加一个“AVeryPrivilegedMethod”,它只对Child2和Child3可访问,而对任何其他子级都不可访问(或者使其可配置,以便将来Child5也可以使用它,只需进行最小的更改)。什么样的设计模式/架构模式适合此账单

使用的语言-C#


PS:我在考虑使用,但意识到这会应用于汇编级别

我不明白这与“设计模式”有什么关系——这只是语言特性的问题。C#没有一种语言特性允许这种简单的选择封装


我想您可以选择在层次结构中插入一个新类,
BaseWithExtras
,派生自
Base
,并让一些子类派生自
Base
,其他子类派生自
BaseWithExtras
,或者停止担心它,让方法对所有派生类都可用。

我看不出这与“设计模式”有什么关系——这只是语言特性的问题。C#没有一种语言特性允许这种简单的选择封装


我想您可以选择在层次结构中插入一个新类,
BaseWithExtras
,派生自
Base
,并让一些子类派生自
Base
,其他子类派生自
BaseWithExtras
,或者不再担心它,只需使该方法可用于所有派生类。

您需要进行另一个抽象级别:

public class Parent { }
public class MethodContainer : Parent { public void SomeMethod() { } }
然后每个子类继承相应的类:

// Does not have method
public class ChildA : Parent

// Has Method
public class ChildB: MethodContainer

您可能希望进行另一个抽象级别:

public class Parent { }
public class MethodContainer : Parent { public void SomeMethod() { } }
然后每个子类继承相应的类:

// Does not have method
public class ChildA : Parent

// Has Method
public class ChildB: MethodContainer

听起来好像您缺少了另一个抽象类
SpecialChild
,因为缺少更好的名称),该类继承自
父类,但派生自
Child2
Child3

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

问自己这样一个问题:
Child2
Child3
有什么不同,他们自己有共同的行为,但对所有其他孩子都有不同的行为
SpecialChild
对这种行为进行建模,在您的问题中给出的示例中将是实现
AVeryPrivilegedMethod
的地方

听起来好像您缺少了另一个抽象类
SpecialChild
,因为缺少更好的名称),它继承自
Parent
,但派生自
Child2
Child3

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

问自己这样一个问题:
Child2
Child3
有什么不同,他们自己有共同的行为,但对所有其他孩子都有不同的行为
SpecialChild
对这种行为进行建模,在您的问题中给出的示例中将是实现
AVeryPrivilegedMethod
的地方

如果您只能访问基类,我建议在基类方法中对类的类型使用反射,并且只允许您希望正确使用基类方法的类。如果不是这样,并且您有能力修改层次结构或派生类,只需从您的基类派生另一个类,公开您感兴趣的方法,并使您的类从中派生。

如果您只能访问基类,我会说在基类方法中对类的类型使用反射,并且只允许您希望正确使用基方法的类。如果情况并非如此,并且您可以修改层次结构或派生类,只需从您的基类派生另一个类,公开您感兴趣的方法,并使您的类从中派生即可。

可能没有好的选项,因为这不是标准的保护级别。这里有一个选择

 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),并且出于某种原因需要您所述的层次结构。还有其他的答案,建议一个新的子类级别,这可能是在您的情况下最好的答案。如果没有,这可能会有所帮助。

可能没有好的选择,因为这不是标准的保护级别。这里有一个选择

 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),并且出于某种原因需要您所述的层次结构。还有其他的答案,建议一个新的子类级别,这可能是在您的情况下最好的答案。如果没有,这可能会有所帮助。

与依赖项注入的良好关联如何(这样,如果需要允许其他类访问函数,您可以在以后对其进行更改)

然后根据子级的不同,可以注入
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

与依赖项注入的良好关联如何(因此,如果需要允许其他类访问函数,您可以稍后对其进行更改)

然后根据子级的不同,可以注入
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

如果这些方法只在某些子类中使用,包括它们在继承层次结构中,看起来不是一个好主意。在这里,我们想要实现的是实现重用,因此通过依赖项注入进行组合将是一个好主意,然而,如果您需要将该方法作为类接口的一部分公开,那么Mixin(如果在C#中有可能)将是一个好主意