【问题标题】:Calling methods from inheriting classes从继承类调用方法
【发布时间】:2015-12-25 13:03:59
【问题描述】:
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]);
            }
        }
    }
}

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

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

【问题讨论】:

  • 这个问题可能更适合codereview.stackexchange.com
  • 我会将LoadName 更改为SetNameLoadName 表示它将获取名称,因此返回一个字符串。
  • 为什么不将带有 id 的 LoadName 包含到抽象类中并覆盖两者?
  • @sstan 本来可以,只是这似乎有点像样例。这个问题在 Code Review 中非常边缘化,很有可能被关闭,或者 OP 可能对 CR 上的答案不满意。如果您还没有这样做,我建议您阅读A Guide to Code Review for Stack Overflow users
  • 让我感到奇怪的是,您的人物对象一开始就没有“加载”。为什么不使用一个构造函数来获取 id 和 name 并立即进行创建和初始化,当您拥有输入数据并知道要创建什么类型时?这可能是基本类型的构造函数。如果您需要派生类型的更多(数据),请在派生类型中创建额外的构造函数并从中调用基构造函数。

标签: c# oop inheritance methods


【解决方案1】:

你可以说:

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

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

【讨论】:

    【解决方案2】:

    另一种简化设计并使代码更自然的方法是将重载添加到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]);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是一种方法

          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]); 
                      }
                  }
              }
          }
      ​
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 2016-06-20
        • 2011-10-17
        • 2021-06-17
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多