【发布时间】:2018-12-31 08:57:50
【问题描述】:
我对以下场景的设计模式或最佳实践方法感兴趣:
假设我们有多个从公共接口派生的子类:
public interface IPerson{
string Name;
}
public class SomePerson : IPerson{
string Name;
bool hasAccess;
bool GetAccessInfo(){
//implementation
}
}
public class OtherPerson : IPerson{
string Name;
int NumberOfPoints;
int GetNumberOfPoints(){
//implementation
}
}
现在假设我们有一个包含 IPerson 对象集合的类:
public class PersonHandler{
public List<IPerson> People;
}
所以这里的问题是,您将如何迭代 People 集合,并且仍然能够在一次迭代中使用各个子类的成员和方法,例如 GetNumberOfPoints 或 GetAccessInfo?
我不喜欢显式检查类型,也不喜欢在接口中包含子类特定的方法,因为这有点违背 OO 设计的目的。
也许理想情况下这些不应该在同一个集合中?我正在寻找与语言无关的答案。
【问题讨论】:
-
我认为这与如何迭代无关,这是一个单独的问题,但问题是如何调用仅在具有基点的派生类中的方法?
-
@zar 您可以进行强制转换/类型检查以调用子类函数/成员。但是,我认为这通常不是好的做法。
-
是的,它不是。我记得我在某个地方遇到了 BBC 编码标准,这是被禁止的。 OOP 的想法是让类做那件事,它知道类型,但我知道我们确实想要检索结果或属性,但问题仍然存在。
-
我之前已经考虑过这个问题,我认为解决方案可能是应用访问者模式,但该模式本身是其中最复杂的一种,不确定它的使用频率。
标签: oop inheritance design-patterns encapsulation