2017-09-25 89 views
0

我想從兩個接口(IIndividual和IGuardian)繼承的類(學生)填充列表模板。人口成功相當不錯。現在的問題是最後一個元素替換舊元素並覆蓋它們。很困惑。最後添加的項目將替換列表中的所有現有項目

interface IIndividual 
{ 
    String Name { get; set; } 
    String Number { get; set; } 
    String Address { get; set; } 
} 

interface IGuardian 
{ 
    String Name { get; set; } 
    String Number { get; set; } 
    String Address { get; set; } 
} 

class Student: IIndividual, IGuardian 
{ 
    String IIndividual.Name { get; set; } 
    String IIndividual.Number { get; set; } 
    String IIndividual.Address { get; set; } 
    String IGuardian.Name { get; set; } 
    String IGuardian.Number { get; set; } 
    String IGuardian.Address { get; set; } 

    public void output()//testing 
    { 
     IIndividual i = this as IIndividual; 
     Console.WriteLine("Individual Name = {0}", i.Name); 
     Console.WriteLine("Individual Number = {0}", i.Number); 
     Console.WriteLine("Individual Address= {0}", i.Address); 
     IGuardian g = this as IGuardian; 
     Console.WriteLine("Guardian Name = {0}", g.Name); 
     Console.WriteLine("Guardian Number = {0}", g.Number); 
     Console.WriteLine("Guardian Address= {0}", g.Address); 
    } 
} 


static void Main(string[] args) 
{ 
    List<Student> s = new List<Student>(); 
    Student ss = new Student(); 
    IIndividual ii = ss as IIndividual; 
    IGuardian gg = ss as IGuardian; 
    gg.Name = "Kinyo Yemi"; 
    gg.Number = "08"; 
    gg.Address = "Bunker Street"; 

    ii.Name = "Hope Ajayi"; 
    ii.Number = "08185543124"; 
    ii.Address = "Metropolitan Council"; 
    s.Add(ss); 
    ///////////////////// 
    gg.Name = "Awwal Kadi"; 
    gg.Number = "08072523245"; 
    gg.Address = "R32 Damboa"; 

    ii.Name = "Morak Suleiman"; 
    ii.Number = "08535755543"; 
    ii.Address = "Sederal Low Cost"; 
    s.Add(ss); 
    foreach (var x in s) 
    { 
     x.output(); 
     Console.WriteLine(); 
    } 
    Console.Read(); 
} 
+5

這不是發生了什麼事情。 'ss','ii'和'gg'從頭到尾都是相同的對象。這就是參考類型的工作原理。你只創建一個對象,'Student ss = new Student()' –

回答

2

因爲你永遠只創建一個學生:

Student ss = new Student(); 

但是你把它添加到列表中兩次:

s.Add(ss); 
//... 
s.Add(ss); 

如果要添加第二個學生,創建一個新的:

Student ss2 = new Student(); 

然後填充對象與價值觀,並將其添加到列表:(再次寫ss = new Student();甚至只是重新分配相同的變量)

s.Add(ss2); 

無論類型有多少變化或者你使用的變量,如果你只創建了一個對象實例,那麼你的所有變量都指向同一個實例。

+0

我現在明白了。有用。 – Kinyo356

1

你不是在創造一個新的學生 - 你要加兩個同一個學生。

第二個作業將覆蓋第一個作業。

插入一個新的 '新' 第二s.add(SS)(註明「/// 這裏 ///)

,然後進行重新分配你的接口...

static void Main(string[] args) 
    { 
     List<Student> s = new List<Student>(); 
     Student ss = new Student(); 
     IIndividual ii = ss as IIndividual; 
     IGuardian gg = ss as IGuardian; 
     gg.Name = "Kinyo Yemi"; 
     gg.Number = "08"; 
     gg.Address = "Bunker Street"; 

     ii.Name = "Hope Ajayi"; 
     ii.Number = "08185543124"; 
     ii.Address = "Metropolitan Council"; 
     s.Add(ss); 
     ////////**here**///////////// 
     ss = new Student(); 
     ii = ss as IIndividual; 
     gg = ss as IGuardian; 

     ///////////////////// 
     gg.Name = "Awwal Kadi"; 
     gg.Number = "08072523245"; 
     gg.Address = "R32 Damboa"; 

     ii.Name = "Morak Suleiman"; 
     ii.Number = "08535755543"; 
     ii.Address = "Sederal Low Cost"; 
     s.Add(ss); 
     foreach (var x in s) 
     { 
      x.output(); 
      Console.WriteLine(); 
     } 
      Console.Read(); 
    } 
+0

'第二項任務覆蓋第一個'更好的'覆蓋''。在解釋面向對象代碼時,需要小心如何使用'覆蓋':) –

+0

是的,這就是我的意思,謝謝@MartinJames ...修復它 – FastAl

+0

它也可以。 – Kinyo356

1

正如其他人指出的那樣,你只能創建一個一個學生對象,所以當然你不會在你的列表中看到兩個。但是這裏有更大的問題。

你在做什麼實際上有點奇怪。 IIndividualIGuardian實際描述完全一樣的東西

interface IIndividual 
{ 
    String Name { get; set; } 
    String Number { get; set; } 
    String Address { get; set; } 
} 

interface IGuardian 
{ 
    String Name { get; set; } 
    String Number { get; set; } 
    String Address { get; set; } 
} 

然後奇怪的是你的Student類明確地同時實現了:

class Student: IIndividual, IGuardian 
{ 
    String IIndividual.Name { get; set; } 
    String IIndividual.Number { get; set; } 
    String IIndividual.Address { get; set; } 
    String IGuardian.Name { get; set; } 
    String IGuardian.Number { get; set; } 
    String IGuardian.Address { get; set; } 
} 

是否真的化妝踏踏實實做這樣的說法?

如果你要改變你的接口和類這樣的:

public interface IIndividual 
{ 
    string Name { get; set; } 
    string Number { get; set; } 
    string Address { get; set; } 
} 

public interface IGuardian : IIndividual 
{ 
    // Only things specific to Guardians should be here 
    // If there is nothing specific to Guardians, 
    // dont have a IGuardian interface at all 

    string WorkPhone { get; set; } 
} 

public class Student : IIndividual 
{ 
    //Guardian should be a property of a Student 
    public IGuardian Guardian { get; set; } 

    public string Name { get; set; } 
    public string Number { get; set; } 
    public string Address { get; set; } 
} 

public class Guardian: IGuardian 
{  
    public string Name { get; set; } 
    public string Number { get; set; } 
    public string Address { get; set; } 
    public string WorkPhone { get; set; } 
} 

這樣做的好處這種方式很簡單,學生和監護人是個人吧?學生既不是個人也不是監護人,學生只是個人。你應該創建一個實施IGuardian的Guardian類,然後讓Student具有IGuardian的屬性。

你應該考慮的另一件事是你的output()方法。如果您只想查看對象的字符串表示形式,則可以覆蓋對象的ToString()方法。

我做了一個小提琴here,它清理了你的代碼並稍微演示了我的答案。

+0

我非常感謝你的建議。這將使運行更容易。 – Kinyo356