这是我的特定场景,其中包含一个接口及其实现:
IPerson {string Name;}
American : IPerson {string Name;}
Asian : IPerson {string Name;}
European : IPerson {string Name;}
People = new List<IPerson>(); // This list can have American, Asian and/or European
Run Code Online (Sandbox Code Playgroud)
当我访问People列表时,我需要区分美国,亚洲和欧洲,他们可以共享相同的界面.使用额外的接口(IAmerican,IAsian,IEuropean)是好的,它们都实现了IPerson并使用它来区分实现类,如:
IAmerican : IPerson {}
IAsian : IPerson {}
IEuropean : IPerson {}
American : IAmerican {string Name;}
Asian : IAsian {string Name;}
European : IEuropean {string Name;}
People = new List<IPerson>();
People.Add(new American());
People.Add(new Asian());
People.Add(new European());
var americans = People.OfType<IAmerican>(); // Getting all Americans from People
Run Code Online (Sandbox Code Playgroud)
新接口没有多大用处,只能隔离对象.这是一个好方法还是应该在IPerson中实现某些类型属性来区分其实现?
你不需要做第二步,你的第一步也应该工作.
void Main()
{
var people = new List<IPerson>();
people.Add(new American { Name = "jack"});
people.Add(new American { Name = "John"});
people.Add(new Asian { Name = "ho"});
Console.WriteLine (people.OfType<American>());
}
public interface IPerson {
string Name {get; set;}
}
class American : IPerson {public string Name {get; set; }}
class Asian : IPerson {public string Name {get; set; }}
class European : IPerson {public string Name {get; set; }}
Run Code Online (Sandbox Code Playgroud)
输出:
插孔
约翰
该列表将每个对象定义为它们的公分母(IPerson),但这并不意味着它丢失了对实际对象的跟踪.我认为不需要创建过时的接口.
话虽如此:我更喜欢这里的作品而不是继承.什么的分离American从European?在Person类中保留一个属性(使其成为一个类而不是一个接口),指示一个人的区域性.
我会选择房产。
enum PersonType
{
American, Asian, European
}
interface IPerson
{
string Name { get; set; }
PersonType Type { get; }
}
American : IPerson
{
public string Name { get; set; }
public PersonType Type { get { return PersonType.American; } }
}
Run Code Online (Sandbox Code Playgroud)
并查询Americans:
var americans = People.Where(p => p.Type == PersonType.American);
Run Code Online (Sandbox Code Playgroud)
您可能应该为此找到一个更好的名称enum,但这里重要的是概念,而不是名称。