PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# Interface-Vererbung, Polymorphismus


Kennung Eins
2004-10-18, 21:24:49
Ich stehe grad vor einem Problem :)

Ich habe eine Klasse, die soll enumerable sein (also IEnumerable und IEnumerator implementiert).
Jetzt moechte ich 3 verschiedene MoveNext() Methoden definieren.

Ich habe das ueber Abstrakte Klassen und Interfaces versucht und jedes Mal haut es mich auf die Schnauze.

Folgendes:interface ITeil1:IEnumerable,IEnumerator
{
new bool MoveNext();
}

interface ITeil2:IEnumerable,IEnumerator
{
new bool MoveNext();
}

interface ITeil3:IEnumerable,IEnumerator
{
new bool MoveNext();
}

public class Haupt:ITeil1,ITeil2,ITeil3
{
<code>

public bool ITeil1.MoveNext()
{
<implementation>
}

public bool ITeil2.MoveNext()
{
<implementation>
}

public bool ITeil3.MoveNext()
{
<implementation>
}

<code>
}Ein erstes Problem ist hier schonmal, dass der verlangt, dass ich ein separates IEnumerable.MoveNext() implementiere.
Warum???? Sollte dar das nicht ueber die anderen Interfaces erben? (Das "new"-keyword im Interface ist nicht der Grund)

Jetzt moechte ich in einer Testklasse das ForEach nutzen.Haupt obj = new Haupt();
foreach (Haupt temp in (ITest1)obj)
Console.WriteLine(temp.ToString());
foreach (Haupt temp in (ITest2)obj)
Console.WriteLine(temp.ToString());
foreach (Haupt temp in (ITest3)obj)
Console.WriteLine(temp.ToString());

Warum geht das nicht? Was ist da falsch dran?
Wie koennte man das besser machen?

Ich waere super dankbar fuer jedwede Hilfe!

(das ist nur eine vereinfachte erdachte Struktur, das Projekt ist eigentlich ein bisschen groesser)

ScottManDeath
2004-10-18, 23:10:41
Das ganze dürfte nicht gehen da ein Objekt nur genau einen Typ hat (unter .NET). Interfaces geben lediglich eine Gruppe an Methoden an, über die Du auf das Objekt zugreifen kannst. Die Methode MoveNext gibt es in Wirklichkeit nur einmal, kann aber in verschiedenen Interfaces die alle hierarchisch voneinander erben deklariert werden, d.h. verschiedene Interfaces lassen Zugriff auf eine Methode zu.

Kennung Eins
2004-10-18, 23:16:34
Hm ..... wie sonst koennte ich verschiedene Implementationen von MoveNext hinbekommen?

Demirug
2004-10-21, 18:37:33
Basisklasse welche das Interface implementiert. Die MoveNext muss dabei entweder virtuell (falls es eine sinnvolle standardimplemntierung gibt) oder abstrakt sein. Davon dann die 3 spezialisierten Klassen ableiten und die MoveNext Methode überladen.

In deinem Fall wäre allerdings ein anderes Model besser.

Eine Datenklasse welche die Informationen enthält und 3 "Viewer" Klassen (die auch nach dem Model von oben eine gemeinsame Basis haben). Die Viewer bekommen im Konstrucktor ein Objekt der Datenklasse übergegeben und stelllen dann die richtige Enumerationsmethode zur Verfügung.

Kennung Eins
2004-10-21, 22:40:23
Basisklasse welche das Interface implementiert. Die MoveNext muss dabei entweder virtuell (falls es eine sinnvolle standardimplemntierung gibt) oder abstrakt sein. Davon dann die 3 spezialisierten Klassen ableiten und die MoveNext Methode überladen.

In deinem Fall wäre allerdings ein anderes Model besser.

Eine Datenklasse welche die Informationen enthält und 3 "Viewer" Klassen (die auch nach dem Model von oben eine gemeinsame Basis haben). Die Viewer bekommen im Konstrucktor ein Objekt der Datenklasse übergegeben und stelllen dann die richtige Enumerationsmethode zur Verfügung.
Danke, Demi!
Deine erste Methode hatte ich exakt so probiert, doch beim Casten auf eine der spezialisierten Klassen gabs immer Compiler-Errors.
Irgendwo muß da noch ein logischer Denkfehler sein.

Deine Zweite Methode klingt absolut cool :) Das werd ich mal versuchen. Bin gespannt, obs da dann wieder Cast-Errors gibt.

Demirug
2004-10-22, 07:05:18
Danke, Demi!
Deine erste Methode hatte ich exakt so probiert, doch beim Casten auf eine der spezialisierten Klassen gabs immer Compiler-Errors.
Irgendwo muß da noch ein logischer Denkfehler sein.

Deine Zweite Methode klingt absolut cool :) Das werd ich mal versuchen. Bin gespannt, obs da dann wieder Cast-Errors gibt.

Bei der zweiten darfst du ja nicht casten. Das muss dan eher so aussehen.

Haupt obj = new Haupt();
HauptView view = new HauptView1 (obj)
foreach (Haupt temp in view)
Console.WriteLine(temp.ToString());
view = new HauptView2 (obj)
foreach (Haupt temp in view)
Console.WriteLine(temp.ToString());
view = new HauptView3 (obj)
foreach (Haupt temp in view)
Console.WriteLine(temp.ToString());