Properties in Klassen mit geerbten abstrakten Klassen

Razorhawk

Webdesigner und MSP
Ich habe eine abstrakte Klasse geschrieben:

C#:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;

namespace BatchSort.Graphic
{

    public abstract class GraphicUnits
    {

        private Pen _pen;

        public Pen Pen
        {
            get { return _pen; }
            set { _pen = value; }
        }

        private Brush _brush;

        public Brush Brush
        {
            get { return _brush; }
            set { _brush = value; }
        }

        private bool _fVisible = true;

        public bool Visible
        {
            get { return _fVisible; }
            set { _fVisible = value; }
        }

        private Color _fillColor;
 
        public Color FillColor
        {
            get { return _fillColor; }
            set { _fillColor = value; }
        }

        private Point _location;

        public Point Location
        {
            get { return _location; }
            set { _location = value; }
        }
        
        private int _blockcount;

        public int Blockcount
        {
            get { return _blockcount; }
            set { _blockcount = value; }
        }

        public GraphicUnits(Pen pen)
        {
            _pen = pen;
        }

        public GraphicUnits(Color brush)
        {
            _brush = new SolidBrush(brush);
            _fillColor = brush; 
        }

        public GraphicUnits()
        {

        }

        public abstract void Draw(Graphics g);

        public abstract bool Contains(Point pt);

    }
}

Nun habe ich eine zweite Klasse geschrieben, welche von der da oben erbt und die abtrakten Methoden überschreibt:

C#:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace BatchSort.Graphic
{
    public class RouterUnit : GraphicUnits
    {
        private int _myProperty

        public int MyProperty
        {
            get { return _myProperty; }
            set { _myProperty= value; }
        }

        private Bitmap image = new Bitmap(@"Images\\batchUnit.gif", true);

        public RouterUnit(Point pt) : base()
        {
            Location = pt;   
        }

        public override void Draw(Graphics g)
        {

           /* ... irgendein Code ...*/

         }

        public override bool Contains(Point pt)
        {

                  /* ... irgendein Code ...*/
            
        }

    }
}
Wenn ich nun eine Instanz der Klasse RouterUnit mache, dann habe ich zwar zugriff auf die Properties der abstrakten Klasse jedoch kein Zugriff auf das Property "MyProperty".
Woran liegt das?

Zum anderen bräuchte ich das, da ich mehrere Klassen von der abtrakten erbe und in den darunterliegenen Klassen nunmal einige Properties nicht in alle vorhanden sein sollen und ich somit das nicht einfach in die abstrakte Klasse mit reindefinieren sollte.

Welche Möglichkeiten habe ich?
 
Zuletzt bearbeitet:
C#:
// 1
GraphicsUnits gu = new  RouterUnit();
gu.MyProperty = ...;

// 2
RouterUnit ru = new  RouterUnit();
ru.MyProperty = ..;

Wie wolltest denn auf die Property zugreifen? Variante 1 oder 2?

2 geht, 1 nicht..

Ansonsten wüsst ich grad nicht, warum MyProperty nicht zugreifbar sein sollte..

lg, Alex
 
Ah okay das ist der Fehler, ich kann die aber auch sagen, warum ich glaube Variante 1 nehmen zu müssen.

Ich verwende eine

C#:
List<Graphicunits> liste = new List<GraphicUnits>();
bei der mal
C#:
liste.Add(new RouterUnit(...));
und mal
C#:
liste.Add(new BufferUnit(...));
verwendet wird, wobei Buffer eine andere Klasse ist die von der abstrakten ableitet.
Von daher habe ich das Problem es wie bei der ersten Variante bisher machen zu müssen.

Um genauer zu erklären was der sinn der Sache ist.
Ich habe eine ArrayList mit
C#:
List<GraphicUnits>
,
die zusammen eine n*m Matrix ergeben. es werden an unterschiedlichen Stellen beide Klassen in den Listen gespeichert.
Es ist nicht zufällig und die Reihenfolge einspricht einem eindeutigen Muster.
 
Okay,.. Variante 1 bzw. deine Speicherung ist ja kein Problem..

Nur wenn du das Objekt als z.b RouterUnit benutzen willst, mussts auch als solches haben.

C#:
GraphicsUnit gu = new RouterUnit();

RouterUnit ru = gu as RouterUnit;

if (ru != null)
{
  ru.MyProperty = ..;
}

Mit dem "as" Operator machst du einen cast in den angegebenen Typ wobei überprüft wird, ob das mit den 2 Typen auch funktioniert. Wenns nicht geht, bekommst einfach null zurück, ohne das eine Exception fliegt.
 

Neue Beiträge

Zurück