我有三种类型的人:
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 ....
这是一个好设计吗?如果创建了“最佳”实例,但类型设置为“正常”,该怎么办?这会是一个糟糕的设计吗?
答案 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; }
}
}
...