遍历具有不同属性的子类

时间:2018-07-23 20:22:43

标签: oop inheritance design-patterns encapsulation

我对以下情况的设计模式或最佳实践方法感兴趣:

假设我们有多个子类,它们是从一个公共接口派生的:

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设计的目的。

也许理想情况下,那些不应该在同一收藏中?我正在寻找与语言无关的答案。

2 个答案:

答案 0 :(得分:2)

我同意向接口添加特定方法将是一个坏主意(更不用说违反了Interface Segregation Principle)。

模式匹配是函数式编程中的一种常见功能/做法,近年来已进入更多面向对象的语言(在C#7中使用if ( 0 == $rating ) { $html = '<div class="star-rating">'; $html .= wc_get_star_rating_html( $rating, $count ); $html .= '</div>'; } return $html; 运算符以及其他结构(例如{ {1}}语句,如下所示),它指的是基于给定对象的形状进行有条件的分支并绑定到其成员,而不必显式且不安全地投射对象。

我知道您正在寻找与语言无关的答案,但这是您在C#中可能遇到的上述问题:

is

希望这会有所帮助!

答案 1 :(得分:0)

我讨厌标记要关闭的帖子,因为每个问题都是唯一的且具有差异性,而且每个帖子都会吸引潜在的专家,但是请在StackOverflow上检查此post,这非常相似,答案是访问者模式。