【问题标题】:How change object type, when child inherit from same parent but have difrrent method and props当孩子从同一个父母继承但有不同的方法和道具时如何改变对象类型
【发布时间】:2022-01-15 22:29:04
【问题描述】:

在大学里,我有任务要做。我有如下简单的程序。我有一个代表人的父类,而从它继承并代表角色的孩子很少(Archer,Knight,Wizzard)。 我必须实现功能以轻松切换对象类型,从弓箭手到骑士等等。 起初我想用所有独特的方法创建一个大接口,但它打破了 SOLID 规则,但我不能打破这个规则。 有人能帮忙弄清楚吗?

代码如下:

public abstract class Person
    {
        public String Name;
        
        public char Age;
        
        void describe()
        {
            //some code
        }
    }

角色类:

public class Archer : Person
    {
        public int agility;

        public void describe()
        {
            //some code
        }

        public void fightUsingBow()
        {
            //some code
        }
    }

下一个角色:

class Wizzard : Person
    {
        public int mana;

        public void describe()
        {
            //some code
        }
        
        public void castASpell()
        {
            //some code
        }
    }

【问题讨论】:

    标签: .net oop inheritance interface solid


    【解决方案1】:

    我会通过 Factory OOP 来实施和解决这个问题。

    接受 Person 和 dest 对象类型作为输入。 并尽可能多地将 Person 的属性附加到最终的专业人士。

    转换背后的潜在数据丢失可能会通过不同的策略得到缓解。

    【讨论】:

      【解决方案2】:

      您不能只是将弓箭手“转换”为骑士。弓箭手不是骑士。您可以使用与弓箭手相同的基本属性创建一个骑士,但没有内置方法可以做到这一点。一种方法是为一个人使用“复制构造函数” - 例如:

      public Person(Person basePerson)
      {
          this.Name = basePerson.Name;
          this.Age = basePerson.Age
      }
      

      然后向Knight添加一个构造函数,调用复制构造函数:

      public Knight(Person basePerson) : base(basePerson) {}
      

      【讨论】:

        【解决方案3】:

        您真的需要更改对象类型吗?你也可以抽象出这个方法

        例如: 将FightUsingBow()CastASpell() 更改为Attack()SpecialAttack()

        如果需要,您可以为它们创建一个抽象类。例如Guardian 与父类Person

        abstract class Guardian : Person
        {
            public abstract void Attack();
        }
        

        为你的监护人使用 Guardian 类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 2014-08-07
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          相关资源
          最近更新 更多