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
hallo webstarg,
das ist nicht möglich und widerspricht den prinzipien der vererbung.
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
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
Aber ich könnte die Properties mit einer private überschreiben, oder?
webstarg
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#.
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
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
Danke für die vielen Antworten.
Ich werde dann mal schauen was ich mache.
webstarg
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!
@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...
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
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ß...
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)...