0

在大学我有任务要做。我有如下简单的程序。我有一个代表人的父类,而从它继承并代表角色的孩子很少(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
        }
    }
4

3 回答 3

1

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

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

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

public Knight(Person basePerson) : base(basePerson) {}
于 2021-12-11T19:07:26.593 回答
0

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

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

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

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

为您的监护人使用监护人课程。

于 2021-12-11T18:46:21.617 回答
0

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

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

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

于 2021-12-12T13:20:34.513 回答