Laden...

Properties von vererbten Klassen unsichtbar machen

Erstellt von webstarg vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.097 Views
W
webstarg Themenstarter:in
558 Beiträge seit 2006
vor 16 Jahren
Properties von vererbten Klassen unsichtbar machen

Hallo!

Wie kann man Properties von vererbten Klassen für Benutzer dieser Klasse unsichtbar machen? Also wenn ich eine Klasse habe, die von ComboBox erbt und ich möchte, dass der Benutzer dieser Klasse Items nicht sieht.

danke im voraus
webstarg

F
722 Beiträge seit 2005
vor 16 Jahren

hallo webstarg,

das ist nicht möglich und widerspricht den prinzipien der vererbung.

W
webstarg Themenstarter:in
558 Beiträge seit 2006
vor 16 Jahren

Aha.

danke für die Antwort
webstarg

K
174 Beiträge seit 2006
vor 16 Jahren

Hallo webstarg,

ich stimme feadur zu. Allerdings ist es möglich Properties für den Designer unsichtbar zu machen:


public class MyComboBox : ComboBox
{
    [Browsable(false)]
    [EditorBrowsable(EditorBrowsable.Never)]
    public override Text { get { return base.Text; } set { base.Text = value; } }
}

Browsable gibt dabei an, dass die Property im Eigenschaftsfenster des Designers nicht zu sehen ist.
Editorbrowsable gibt an, dass die Property von Intellisense nicht angezeigt wird.
Trotzdem sind jene Properties per Code ansprechbar.

Grüße,
Kani

432 Beiträge seit 2005
vor 16 Jahren

hallo webstarg

zu kani ist zu ergänzen, dass Items (oder allgemeiner: Eigenschaften gelegentlich) nicht überschreibbar sind.

Dann gilt:


[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new ObjectCollection Items
{
   get { return base.Items; }
}

gruß
ron

W
webstarg Themenstarter:in
558 Beiträge seit 2006
vor 16 Jahren

Aber ich könnte die Properties mit einer private überschreiben, oder?

webstarg

5.742 Beiträge seit 2007
vor 16 Jahren

nein, denn was passiert in so einem Fall:


public class Base
{
   public int Value;
}
public class Sub : Base
{
   private new Value; //das geht nicht!!!
}

//und zwar darum:
Sub s = new Sub();
Base b = s;
Debug.Print(b.Value.ToString());

Deshalb verbietet das die Syntax von C#.

K
174 Beiträge seit 2006
vor 16 Jahren

Hallo winSharp93,

warum sollte das nicht gehen:


public class Base
{
    public int Value;
}

public class Sub : Base
{
    private new Value;
    // natürlich geht das, nur ob es immer Sinn macht ist die Frage... und c# verbietet dies nicht!
}

public class OtherBase
{
    private int _Value;

    public virtual int Value { get { return this._Value; } set { this._Value = value; } }
}

public class OtherSub : OtherBase
{
    // Folgendes geht nicht und führt zu einem Compilerfehler.
    private override int Value { get { return base.Value; } set { base.Value = value; } }
}


@webstarg:
In deinem Falle wäre folgendes möglich:


public class MyComboBox : ComboBox
{
    private /*oder protected*/ new ObjectCollection Items
    {
        get { return base.Items; }
        set { base.Items = value; }
    }
}

Versteckt ist deine Eigenschaft allerdings trotzdem nicht wirklich:


MyComboBox myCmb = new MyComboBox()
ComboBox cmb = myCmb;

myCmb.Items; // Produziert Compilerfehler (Zugriff nicht möglich)
cmb.Items; // Alles Ok! (Zugriff gewährt)

Grüße,
Kani

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo zusammen,

vielleicht sollten wir mal wieder auf den Kern des Sache kommen:

das ist nicht möglich und widerspricht den prinzipien der vererbung.

Es stimmt was mit dem Design nicht, wenn man Properties verstecken will. Wichtig ist das Design so zu ändern, dass das Verstecken nicht mehr nötig ist, statt mit suspekten "Tricks" die Property doch möglichst gut zu verstecken.

herbivore

W
webstarg Themenstarter:in
558 Beiträge seit 2006
vor 16 Jahren

Danke für die vielen Antworten.
Ich werde dann mal schauen was ich mache.

webstarg

5.742 Beiträge seit 2007
vor 16 Jahren

Original von Kani
Hallo winSharp93,
warum sollte das nicht gehen

Hallo, ich gebe zu, dass ich mich etwas ungeschickt ausgedrückt habe - ich meinte nur, dass die Syntax von C# ein komplettes Überschreiben nicht zulässt (so, dass hinterher überhaupt kein Zugriff mehr besteht). Und das da Überschreiben mit private auch nicht funktioniert. Mein Fehler!

O
778 Beiträge seit 2007
vor 16 Jahren

@herbivore:
Naja, das Problem ist ja nu, dass man auf das Desgign der ComboBox wenig Einfluss hat. Klar könnte man ein UserControl erstellen und darein dann eine ComboBox, womit man dann nur bestimmte Eigenschaften nach außen geben könnte, aber das giubt ja wohl ein deutliches Effizienzproblem...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo onlinegurke,

man sollte nur von ComboBox erben, wenn das was man bauen will, das eine ComboBox IST. Wenn das so ist, sehe ich aber keinen Grund, etwas zu verbergen.

Wenn man etwas anderes will und deinem UserControl/ComboBox-Vorschlag, sehe ich keinerlei Effizienzproblem.

herbivore

O
778 Beiträge seit 2007
vor 16 Jahren

Ja, wenn man streng nach dem Prinzip der Objektorientierung vorgeht, müsste man das so machen, aber, angenommen ich möchte spezielle ComboBox machen, mit der man automatisch immer alle auf dem Rechner installierten Laufwerke auswählen kann und das gewählte Laufwerk als DriveInfo-Objekt abfragen kann (keine Ahnung ob's die Klasse gibt, aber das ist ja egal). Dann lässt einem das Design der ComboBox keine ausreichende Chance, und eine komplett neue ComboBox zu entwickeln, dafür ist der Entwicklungsaufwand dann doch zu groß...

F
10.010 Beiträge seit 2004
vor 16 Jahren

Schon mal was von Facade gehört?

O
778 Beiträge seit 2007
vor 16 Jahren

Nein, ich mein, die Variante über UserControl wär ja genau das, aber gehört hab ich's noch nicht (im Bereich der theoretischen Informatik fehlt mir quasi alles, weil ich (noch) nicht studiert habe)...