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