2015-12-25 102 views
0
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]); 
      } 
     } 
    } 
} 

有没有更好的方法来做到这一点? 我原来的班级比较大,所以复制它并不理想。来自继承类的调用方法

(注意,这个例子是没有关系到我的项目,所以它可能不是最好的例子。)

+1

此问题可能更适合http://codereview.stackexchange.com/。 – sstan

+0

我会将'LoadName'更改为'SetName'。 'LoadName'意味着它将获取名称,并因此返回一个字符串。 – AustinWBryan

+0

为什么不将包含id的LoadName包括到抽象类中并覆盖两者? –

回答

0

你可以说:

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

哪个不是那么糟糕。这里的问题是这个人没有LoadName(int)当然,在父类中创建一个抽象的重载会解决这个问题,但我假设你不想这样做。因此,LoadName(int)Soldier类所特有的,这是获得它的唯一方法。

0

这里有一种方法

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

简化设计并使代码更自然的另一种方法是将过载添加到抽象类本身。这迫使任何继承类为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]); 
     } 
    } 
}