【问题标题】:create a List of different Type of Objects创建不同类型对象的列表
【发布时间】:2019-12-30 04:40:40
【问题描述】:
class HeroClass
{
  skill1
  skill2
}

class Batman : HeroClass
{
  skill3
  skill4
}

class Robin : HeroClass
{
  skill3
  skill4
  skill5
} 

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

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

如何做到这一点?

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

非常感谢!!

【问题讨论】:

  • 您将相同的属性放入 HeroClass 基类中,如果您不想这样做,可以将您的 batmanHero 对象转换为 ((Batman)batmanHero).MySuperpower 以访问道具

标签: c# inheritance interface polymorphism


【解决方案1】:

第一期:

如果我创建类型“HeroClass”的列表,我将无法访问对象类型“蝙蝠侠”或“罗宾”的特定属性

您可以通过强制转换对象来访问特定的属性,例如:

var heroList = new List<HeroClass>();
 heroList.Add(new Batman { skill3 = "skill3" });
 heroList.Add(new Robin { skill5 = "skill5" });
 Console.WriteLine(((Batman)heroList[0]).skill3);

现场演示here

第二期:

这些属性完全相同(多态性没有任何意义)如果类具有完全相同的属性,这是否是代码异味?

是的,你应该使用Interface Segregation Principle (ISP)SOLID

不应强迫客户实现他们不使用的接口。代替一个胖接口,许多基于方法组的小接口是首选的,每个接口服务一个子模块

例如

    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

【讨论】:

  • 这能回答你的问题吗? @blender111
  • 你能给我你第二个建议的代码示例吗?谢谢你
  • skill1 skill2 .. 是属性还是方法?
  • skill1、skill2 是属性
  • 谢谢!经过一些研究,这对我来说是一个很好的解决方案(投射对象不是一种选择)
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2012-07-16
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多