Archief - [PROG]C# Generics en Inheritance probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

H@voc_!nc.

Legacy Member
De volgende code werkt nie:

PHP:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1 {
  class ObjectA {
    public override string ToString() {
      return "Object a";
    }
  }

  class ObjectB: ObjectA {
    public override string ToString() {
      return "object b";
    }
  }

  class ObjectAList<T>: List<T> where T: ObjectA {
    protected void SomeFunction(ObjectAList<ObjectA> aList) {
      foreach(ObjectA o in this) {
        Console.WriteLine(o.ToString());
      }
    }
  }

  class ObjectBList: ObjectAList<ObjectB> { 
    private ObjectBList myList =  new ObjectBList();

    public void DoSomething() {
      SomeFunction(myList);
    }
  }




  class Program {
    static void Main(string[] args) {
      ObjectBList b = new ObjectBList();
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.DoSomething();
    }
  }
}

how to get this working.......

Error 1 The best overloaded method match for 'ConsoleApplication1.ObjectAList<ConsoleApplication1.ObjectB>.SomeFunction(ConsoleApplication1.ObjectAList<ConsoleApplication1.ObjectA>)' has some invalid arguments C:\Documents and Settings\Jelle\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 30 7 ConsoleApplication1

Error 2 Argument '1': cannot convert from 'ConsoleApplication1.ObjectBList' to 'ConsoleApplication1.ObjectAList<ConsoleApplication1.ObjectA>' C:\Documents and Settings\Jelle\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 30 20 ConsoleApplication1

snappet eigenlijk niet goed want ObjectB is zeker altijd ook een objectA ...

killgore

Legacy Member
public virtual string ToString in objectA

de basismethode die kan overgeschreven worden moet virtual zijn, diegene die ze overschrijft moet override implementeren.

H@voc_!nc.

Legacy Member
da heeft dus niks met het probleem te zien ToString is virtual in Object waar elk object automatisch van inherit....

killgore

Legacy Member
H@voc_!nc. zei:
da heeft dus niks met het probleem te zien ToString is virtual in Object waar elk object automatisch van inherit....
nja, idd, was eerste wat me gewoon opviel.

kheb lang geen c# geprogrammeerd, maar euh, is dit niet vrij fout :s:

Code:
  class ObjectBList: ObjectAList<ObjectB> {
    private ObjectBList myList =  new ObjectBList();

    public void DoSomething() {
      SomeFunction(myList);
    }
  }
want als ge 1 objectBlist maakt, gade in een soort oneindige lus komen :s.

Sjeng

Legacy Member
Om de method van de base class op te roepen moet je er normaal "base." voorzetten, in dit gegeval:

public void DoSomething() {
base.SomeFunction(myList);
}

En zoals killgore al zei, die functie Tostring() van ObjectA moet virtual zijn.

Probeer dat eens...

WTF wilt dit zeggen --> "class ObjectAList<T>: List<T> where T: ObjectA {"
Enfin, ik kan het al gedeeltelijk raden denk ik :unsure:

H@voc_!nc.

Legacy Member
Sjeng zei:
Om de method van de base class op te roepen moet je er normaal "base." voorzetten, in dit gegeval:

public void DoSomething() {
base.SomeFunction(myList);
}

En zoals killgore al zei, die functie Tostring() van ObjectA moet virtual zijn.

Probeer dat eens...

WTF wilt dit zeggen --> "class ObjectAList<T>: List<T> where T: ObjectA {"
Enfin, ik kan het al gedeeltelijk raden denk ik :unsure:


ten eerste mis zeer mis ik moet niks da mag het heeft niks te zien met die ToString method die is 100% just djeez lees die error message. Als ik nu bevoorbeeld beslis om in objectB die SomeFunction te overschrijven heeft dit onverwachte gevolgen....

2de: dat is een normale generic declaratie da wil zeggen dat ik ObjectAList inherit van List<T> en list<T> is een lijst met objecten van het Type ObjectA

H@voc_!nc.

Legacy Member
PHP:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1 {
  class ObjectA {
    public override string ToString() {
      return "Object a";
    }
  }

  class ObjectB: ObjectA {
    public override string ToString() {
      return "object b";
    }
  }

  class ObjectAList<T>: List<T> where T: ObjectA {
    protected void SomeFunction(ObjectAList<T> aList) {
      foreach(ObjectA o in this) {
        Console.WriteLine(o.ToString());
      }
    }
  }

  class ObjectBList: ObjectAList<ObjectB> {
    private ObjectBList myList =  new ObjectBList();

    public void DoSomething() {
      SomeFunction(myList);
    }
  }




  class Program {
    static void Main(string[] args) {
      ObjectBList b = new ObjectBList();
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.Add(new ObjectB());
      b.DoSomething();
    }
  }
}

heb de oplossing gevonden
ipv ObjectAList<ObjectA>
PHP:
protected void SomeFunction(ObjectAList<T> aList) {
      foreach(ObjectA o in this) {
        Console.WriteLine(o.ToString());
      }
    }

killgore

Legacy Member
neemt niet weg dat die objectBlist volges mij nog steeds onneindige lus is :s.

(kan zijn dat het anders is in c# - lang niet meegewerkt zoals gezegd).

H@voc_!nc.

Legacy Member
killgore zei:
neemt niet weg dat die objectBlist volges mij nog steeds onneindige lus is :s.

(kan zijn dat het anders is in c# - lang niet meegewerkt zoals gezegd).

is idd een foutje denk ik... heb het niet daadwerkelijk gerunned mijn implementatie is iets anders maar te veel code die er niet toe doet dus gheb ik da versimpeld

moet eigelijk zijn
PHP:
ObjectBList: ...{
   private static ObjectBList _List = null;

   public static ObjectList Instance(){
     if(fObjectBList == null){
       _List = new ObjectBList();
     }
     return _List
   }
}


zijnde een standaard singleton implementatie
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan