三种类型的面向对象设计,两种完全相同

时间:2016-10-04 17:23:03

标签: c# oop design-patterns

我有三种类型的人:

    Class Normal
{
    string FirstName { get; set; }
    int Age { get; set; }
}

    Class Better
{
    string FirstName { get; set; }
    int Age { get; set; }
}

    Class Best
{
    string FirstName { get; set; }
    int Age { get; set; }
    string Address { get; set; }
    int Score { get; set; }
}

将它们放在一个列表中的最佳方法是什么? 我自己想出来了:

 public enum PersonType
{
    Normal = 0,
    Better = 1,
    Best  = 2
}

public interface IPerson
{
    PassengerType Type { get; set; }
    string FirstName { get; set; }
    int Age { get; set; }
}

然后

public class Person:IPerson
{
    public PassengerType Type { get; set; }
    public string FirstName { get; set; }
    public int Age { get; set; }
}

我可以将它用于Normal和Better,我可以按类型和

进行干扰
public class Best:IPerson
{
    public PassengerType Type { get; set; }
    public string FirstName { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public int Score { get; set; }
}

并最终:List ....

这是一个好设计吗?如果创建了“最佳”实例,但类型设置为“正常”,该怎么办?这会是一个糟糕的设计吗?

1 个答案:

答案 0 :(得分:1)

一般来说比较班级类型就足够了。您的代码可能如下所示:

public class BasePerson
{
    public string FirstName { get; set; }
    public int Age { get; set; }
}

public class NormalPerson : BasePerson
{   
}

public class BetterPerson : BasePerson
{    
}

public class BestPerson : BasePerson
{
    string Address { get; set; }
    int Score { get; set; }
}

并列出:

IList<BasePerson> list = new List<BasePerson>();
list.Add(new NormalPerson());
list.Add(new BetterPerson());
list.Add(new BestPerson());

最后,使用GetType()typeof()方法,您始终可以确定BasePerson变量引用的实际类型

BasePerson person = new NormalPerson();
var isNormalPerson = person.GetType() == typeof(NormalPerson);
// isNormalPerson is true
var isBestPerson = person.GetType() == typeof(BestPerson);
// isBestPerson is false

如果您需要使用PersonType枚举,则可以通过以下方式修改类:

public abstract class BasePerson
{
    public string FirstName { get; set; }
    public int Age { get; set; }

    public abstract PersonType Type { get; }
}

public class NormalPerson : BasePerson
{
   public override PersonType Type
   {
      get { return PersonType.Normal; }
   }
}

public class BetterPerson : BasePerson
{
   public override PersonType PersonType
   {
      get { return PersonType.Better; }
   }
}

...