2015-12-25 103 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]); 
     } 
    } 
}