从继承类调用方法

本文关键字:方法 调用 继承 | 更新日期: 2023-09-27 18:28:12

abstract class Person
{
    public abstract void LoadName(string name);
}
class Soldier : Person
{
    string soldierName;
    int ID;
    public override void LoadName(string name)
    {
        soldierName = name;
    }
    public void LoadName(int id)
    {
        ID = id;
    }
}
class PersonManager
{
    public void LoadNames(Person[] person, string[] names, int[] id)
    {
        for(int i = 0; i < p.Length; i++)
        {
            person[i].LoadName(names[i]);
            if(person[i] is Soldier)
            {
                /* What I want to do:
                person.LoadName(id[someValue]);       
                   -> Cannot convert from 'string' to 'int'
                   or:
                (Soldier)person.LoadName(id[someValue]);
                   -> Only assignment, call, increment, decrement and new object expressions can be used as a statement
                */
                // What I have to do:
                Soldier s = (Soldier)person[i];
                s.LoadName(id[someValue]);
            }
        }
    }
}

有没有更优雅的方法可以做到这一点?我原来的班级要大得多,所以复制它并不理想。

(请注意,此示例与我的项目无关,因此它可能不是最佳示例。

从继承类调用方法

你可以

说:

((Soldier)person[i]).LoadName(id[someValue]);

这还不错。这里的问题是这个人没有LoadName(int) 当然,在父类中创建抽象重载可以解决此问题,但我假设您不想这样做。因此,LoadName(int)Soldier类独有的,这是获得它的唯一方法。

另一种简化设计并使代码更自然的方法是将重载添加到Person抽象类本身。这迫使任何继承类为 LoadName(int id( 提供实现,我认为它是健康的,因为 id 更适合标识实体。

abstract class Person
{
    public abstract void LoadName(string name);
    public abstract void LoadName(int id);
}
class Soldier : Person
{
    string soldierName;
    int ID;
    public override void LoadName(string name)
    {
        soldierName = name;
    }
    public override void LoadName(int id)
    {
        ID = id;
    }
}
class PersonManager
{
    public void LoadNames(Person[] person, string[] names, int[] id)
    {
        for (int i = 0; i < person.Length; i++)
        {
            person[i].LoadName(names[i]);
            person[i].LoadName(id[i]);
        }
    }
}

这是一种方法

    abstract class Person
    {
        public abstract void LoadName(string name);
    }
    class Soldier : Person
    {
        public string soldierName { get; set; }
        public int ID { get; set; }
        public override void LoadName(string name)
        {
            soldierName = name;
        }
        public void LoadName(int id)
        {
            ID = id;
        }
    }
    class PersonManager
    {
        public void LoadNames(Person[] person, string[] names, int[] id)
        {
            for (int i = 0; i < p.Length; i++)
            {
                person[i].LoadName(names[i]);
                if (person[i] is Soldier)
                {
                    Person newPerson = new Soldier() { soldierName = names[i], ID = id[i] }; 
                }
            }
        }
    }
​

或者这个

    abstract class Person
    {
        public abstract void LoadName(string name, int id);
    }
    class Soldier : Person
    {
        public string soldierName { get; set; }
        public int ID { get; set; }
        public override void LoadName(string name, int id)
        {
            soldierName = name;
            ID = id;
        }
    }
    class PersonManager
    {
        public void LoadNames(Person[] person, string[] names, int[] id)
        {
            for (int i = 0; i < p.Length; i++)
            {
                if (person[i] is Soldier)
                {
                    person[i].LoadName(names[i], id[i]); 
                }
            }
        }
    }
​