创建不同类型的对象的列表

时间:2019-12-30 04:40:40

标签: c# inheritance interface polymorphism

class HeroClass
{
  skill1
  skill2
}

class Batman : HeroClass
{
  skill3
  skill4
}

class Robin : HeroClass
{
  skill3
  skill4
  skill5
} 

我是编程的初学者。 我想制作一个可以容纳不同类型对象的列表。

如果创建类型为HeroClass的列表,则无法访问对象类型为BatmanRobin的特定属性

这怎么办?

另一个问题:如您所见,蝙蝠侠和罗宾类具有相同的属性(3/4),最好让“罗宾”继承自“蝙蝠侠”类吗?这些属性是完全相同的(多态性没有任何意义),如果类具有完全相同的属性,这是代码的味道吗?

非常感谢!!

1 个答案:

答案 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