2017-09-25 93 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