Autor Beitrag
Gabe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 10.12.09 13:56 
Hallo zusammen,

hänge gerade an einem Problem, bei dem ich nicht sicher bin, ob das überhaupt geht, oder mein Ansatz komplett falsch ist.

Ich habe eine Basisklasse. Sie hat 3 Eigenschaften: "Tag", "Length" und "Value".

Length und Value sind immer gleich, auch in erbenden Klassen.
Das Tag-Feld sol immer ein Byte sein, aber von unterschiedlichen Enums. Ich kann die Enums leider nicht zusammenfassen, sonst wäre es kein Problem.

Ich habe mir das so vorgestellt, dass ich die Tag-Eigenschaft in der Basisklasse deklariere und dann in erbenden Klassen entsprechend mit einem entsprechenden Enum-Typ überschreibe. Geht das irgendwie?

Danke schon mal für die Hilfe.

Gruß Gabe
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 10.12.09 14:16 
Hallo Gabe,

das geht genau so wie du es beschrieben hast. Deklarier dein Tag als byte in der Basisklasse. In den Unterklassen das Property einfach überschreiben (Gleichnamiges Property mit Type von deiner gewünschtem Enum nud zwischen Modifier und Variable noch new, damit du zeigst, dass du es bewußt überschreibst).

Gruß Daniel
Gabe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 10.12.09 14:19 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
...zwischen Modifier und Variable noch new...

Genau das hab ich gesucht. Vielen Dank

Gruß Gabe

Edit: Gerade gesehen, dass sogar IntelliSense mir das sagen wollte... :shock:
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 11.12.09 18:45 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
zwischen Modifier und Variable noch new, damit du zeigst, dass du es bewußt überschreibst
Autsch! Mit new werden Member nicht überschrieben, sondern nur verdeckt.

user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mir das so vorgestellt, dass ich die Tag-Eigenschaft in der Basisklasse deklariere und dann in erbenden Klassen entsprechend mit einem entsprechenden Enum-Typ überschreibe.
Die Frage ist: Welchen Typ soll Tag in der Basisklasse haben? Ich nehme mal an, dass du die Eigenschaft dort gar nicht zwingend brauchst, sondern lieber in jedem Nachfahr getrennt deklarieren solltest.

_________________
>λ=
Gabe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: So 13.12.09 16:41 
Hallo Kha,

in der Basisklasse wollte ich es eigentlich als Byte. In den erbenden Klassen sind es verschiedene Enums, die aber alle vom Typ Byte sind.

Ich hatte diese Lösung so gewählt, da ich die Dekodierung in der Basisklasse realisiere. Ich hatte ursprünglich gedacht, dass ich nur die Basisklasse benötige und hierin meine Lösung realisiert. Jetzt bräuchte ich aber Unterklassen, in den das "Tag"-Feld einen anderen Typ hat. Deshalb kam ich da auf die Idee mit dem Überschreiben. Wie würdest du das machen?

Basisklasse sieht vereinfacht aus dem Gedächtnis so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
class BasisKlasse
{
   public byte Tag{get; set;}
   public int Length {get; set;}
   public byte[] Value {get; set;}

   public byte[] Decode()
   {
   ...
   }
}

class SpezialKlasse : Basisklasse
{
   public new EnumTyp Tag{get; set;}
}


Ich möchte natürlich in der Spezialklasse genauso die Dekodierung nutzen, da das Tag-Feld auch wiederum ein Byte ist.
Hoffe das ist soweit klar?! :)

Gruß Gabe
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 13.12.09 17:35 
user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt bräuchte ich aber Unterklassen, in den das "Tag"-Feld einen anderen Typ hat. Deshalb kam ich da auf die Idee mit dem Überschreiben.
Das funktioniert leider nicht, denn beim Überschreiben müssen die exakt gleichen Typen benutzt werden - byte lässt sich nicht durch einen Enum austauschen, selbst wenn der byte als Basis hat :( .
Ich würde deshalb folgendes vorschlagen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  public abstract class Base
  {
    protected abstract byte RawTag { get; set; }
  }

  public enum EnumA { One, Two }

  public class A : Base
  {
    public EnumA Tag { get; set; }

    protected override byte RawTag
    {
      get { return (byte)Tag; }
      set { Tag = (EnumA)value; }
    }
  }

_________________
>λ=
Gabe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: So 13.12.09 18:51 
Hallo Kha,

es ist immer wieder krass, Quelltext von anderen zu lesen und zu entdecken wie einfach und elegant eine Lösung aussehen kann... :-)

Vielen Dank für das Beispiel.
Habs gerade eingebaut. Funktioniert wunderbar.

Gruß Gabe