class HeroClass
{
skill1
skill2
}
class Batman : HeroClass
{
skill3
skill4
}
class Robin : HeroClass
{
skill3
skill4
skill5
}
我是编程的初学者。 我想制作一个可以容纳不同类型对象的列表。
如果创建类型为HeroClass
的列表,则无法访问对象类型为Batman
或Robin
的特定属性
这怎么办?
另一个问题:如您所见,蝙蝠侠和罗宾类具有相同的属性(3/4),最好让“罗宾”继承自“蝙蝠侠”类吗?这些属性是完全相同的(多态性没有任何意义),如果类具有完全相同的属性,这是代码的味道吗?
非常感谢!!
答案 0 :(得分:2)
第一期:
如果创建“ HeroClass”类型的列表,则无法访问“ Batman”或“ Robin”类型对象的特定属性
您可以通过投射对象来访问特定的属性,例如:
var heroList = new List<HeroClass>();
heroList.Add(new Batman { skill3 = "skill3" });
heroList.Add(new Robin { skill5 = "skill5" });
Console.WriteLine(((Batman)heroList[0]).skill3);
现场演示here
第二期:
这些属性完全相同(多态性没有任何意义),如果类具有完全相同的属性,这是代码的味道吗?
是,您应该使用SOLID中的Interface Segregation Principle (ISP)
不应强迫客户端实现不使用的接口。基于一组方法,许多小接口不是一个胖接口,而是每个小接口服务一个子模块
例如
interface IHero
{
string skill1 { get; set; }
string skill2 { get; set; }
}
interface IHero1234: IHero
{
string skill3 { get; set; }
string skill4 { get; set; }
}
interface IHero12345: IHero1234
{
string skill5 { get; set; }
}
class BaseHero : IHero
{
public string skill1 { get; set; }
public string skill2 { get; set; }
}
class Batman : IHero1234
{
public string skill1 { get; set; }
public string skill2 { get; set; }
public string skill3 { get; set; }
public string skill4 { get; set; }
}
class Robin : IHero12345
{
public string skill1 { get; set; }
public string skill2 { get; set; }
public string skill3 { get; set; }
public string skill4 { get; set; }
public string skill5 { get; set; }
}
链接实时演示here