2017-09-25 6 views
0

J'essaie de remplir le modèle List avec une classe (Student) héritant de deux interfaces (IIndividual et IGuardian). La population réussit plutôt bien. Le problème que j'ai maintenant est que le dernier élément remplace les éléments plus anciens et les remplace. Suis confus.Le dernier élément ajouté remplace tous les éléments existants dans la liste

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

Ce n'est pas ce qui se passe. 'ss',' ii', et 'gg' sont tous les mêmes objets du début à la fin. C'est ainsi que fonctionnent les types de référence. Vous ne créez qu'un seul objet, 'Student ss = new Student()' –

Répondre

2

Parce que vous ne jamais créer un étudiant:

Student ss = new Student(); 

Mais vous l'ajoutez à la liste deux fois:

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

Si vous souhaitez ajouter un deuxième étudiant, créer un nouveau:

Student ss2 = new Student(); 

ensuite remplir que objet avec les valeurs et l'ajouter à la liste: (. Ou même simplement réattribuer la même variable en écrivant ss = new Student(); nouveau)

s.Add(ss2); 

Peu importe combien de changements de type ou les variables que vous utilisez, si vous ne créez qu'une seule instance de l'objet, alors toutes vos variables pointent vers cette même instance.

+0

Je l'ai maintenant. Ça marche. – Kinyo356

1

Vous n'êtes pas un nouvel étudiant - vous ajoutez le même étudiant deux fois.

La deuxième affectation écrase la première.

Insérer une nouvelle 'nouvelle' après la 2ème s.add (ss) (marqué '/// ici ///')

Ensuite réassigner vos interfaces ...

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

'La seconde affectation remplace la première' meilleure est ''. Besoin d'être prudent comment vous utilisez 'override' dans les explications de code OO :) –

+0

ouais c'est ce que je voulais dire merci @ MartininJames ... le fixe – FastAl

+0

Il fonctionne également .. – Kinyo356

1

Comme d'autres l'ont fait remarquer, vous ne créez que un objet étudiant donc bien sûr vous n'en verrez pas deux dans votre liste. Cependant, il y a de plus gros problèmes ici.

Ce que vous faites est plutôt bizarre. IIndividual et IGuardian décrivent en fait la même chose :

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; } 
} 

suffit alors curieusement votre Student classe implémente explicitement à la fois:

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; } 
} 

-t-il vraiment un sens pour le faire de cette façon?

Que faire si vous deviez changer vos interfaces et les classes à ceci:

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; } 
} 

L'avantage de le faire de cette façon est simple, un étudiant et un tuteur sont deux individus non? Un étudiant n'est pas à la fois un individu et un gardien, un étudiant est simplement un individu.Vous devez créer une classe Guardian qui implémente IGuardian, puis rendre Student ayant la propriété IGuardian.

Une autre chose à considérer est votre méthode output(). Si vous souhaitez simplement voir une représentation sous forme de chaîne de votre objet, vous pouvez remplacer la méthode d'objet ToString().

J'ai fait un violon here qui nettoie un peu votre code et démontre un peu ma réponse.

+0

J'apprécie vos suggestions. Cela rendra les choses plus faciles en cours de route. – Kinyo356