.NET
VB.NET: Saubere Klassen erstellen mit Properties
Posted on .Heutzutage wird fast nurnoch Objektorientiert programmiert. Das bedeutet, dass ein größeres Projekt schnell mal auf eine Klassenanzahl von 100 und mehr wächst.
Damit man den Überblick behält und den Code, den man schon geschrieben hat möglichst wiederverwenden kann, sollte man ein paar grundlegende Regeln beachten.
In diesem Artikel möchte ich ein Beispiel zeigen, wie man eine Klasse in ein Projekt integriert und dank der benutzten Standardmethoden an ein Datagrid bindet.
Warum schreibe ich diesen Artikel überhaupt? Erst gestern habe wurde in einem Forum die Frage gestellt, warum man eine Liste (Of T) nicht als DataSource für ein DataGridView benutzen kann. Dabei ist das sehr wohl möglich, der User hat seine Klasse aber „unschön“ gestaltet, weswegen sich die anderen Steuerelemente auch quer gestellt haben.
Hier ein Beispiel einer solchen „Unschönen“ Klasse:
Public Class Auto Public marke As String Public motor As String Public geschw As Integer End Class Dim al As New List(Of Auto) al.Add(New Auto With {.marke = "VW", .motor = "Diesel", .geschw = 0}) al(0).geschw += 10Wie man sieht sind hier alle Klassenvariablen öffentlich zugänglich, und die Klasse hat keinerlei Kontrolle darüber, wie sie befüllt werden. Ein weiterer Nachteil ist auch die Inkompabilität zu anderen Steuerelementen, da diese einen Standardkonformen Aufbau der Klasse erwarten. Finden sie bestimmte Elemente in der Klasse nicht so verweigern diese die Funktionalität!
Wie müsste diese Klasse also umgebaut werden, damit diese kompatibel zu anderen Objekten wird?
Public Class Auto Private geschw As Integer Public Sub New(ByVal marke As String, ByVal motor As String) Me.Marke = marke Me.Motor = motor End Sub Private _marke As String Public Property Marke() As String Get Return _marke End Get Set(ByVal value As String) _marke = value End Set End Property Private _motor As String Public Property Motor() As String Get Return _motor End Get Set(ByVal value As String) _motor = value End Set End Property Public Sub beschleunigen(ByVal a As String) geschw += a End Sub Public Sub bremsen(ByVal a As String) geschw -= a End Sub End ClassWie man sieht ist die Klasse nun natürlich um einiges länger geworden. Leider kann man das zur zeit noch nicht anders machen. Aber Abhilfe kommt in der neuen VB.NET Version, wo man die properties so wie in C# 3.0 erstellen kann.
Die Zugriffe auf die Klassenvariablen werden nun über properties gesteuert, die nun auch zB. überprüfen könnten, ob der übergebene Wert überhaupt passt und gegebenenfalls noch Änderungen daran vornehmen.
Aber was bringt uns nun dieser längere Aufbau der Klasse? Nun, wenn wir unser Objekt, das aus dieser Klasse entsteht an andere Objekte übergeben, erwarten diese, dass sie properties vorfinden, mit denen sie arbeiten können.
Hat die Klasse keine Properties so können wir auch bestimmte Funktionen auch nicht benutzen. Ich möchte das mal an einem DataGridView demonstrieren, da dieses Element von den properties sehr schön Gebrauch macht!
Fügt man folgenden Code einem Form mit einer DataGridView hinzu:
Private Sub Form1_Load() Handles MyBase.Load Dim autos As New List(Of Auto) autos.Add(New Auto("VW", "Diesel")) autos.Add(New Auto("Audi", "Benziner")) autos.Add(New Auto("Mercedes", "Diesel")) autos.Add(New Auto("Renault", "Diesel")) autos.Add(New Auto("BMW", "Beziner")) Dim bs As New BindingSource bs.DataSource = autos Me.DataGridView1.DataSource = bs End Suberhält man folgendes Bild:
Bild 1: Die Datagridview stellt alle Informationen angenehm dar
Wie man sieht konnte man mit nur 3 Zeilen Code (Abgesehen vom Erzeugen der Werte) alle Daten der Liste visualisieren. Man beachte desweiteren, dass sogar die Namen der Properties (Marke und Motor) ausgelesen werden und der richtigen Tabelle zugeordnet werden!
Dies könnte man natürlich auch ohne Properties hinbekommen, doch würde man viel mehr Aufwand betreiben müssen und man denke an die Zukunft, in der unser Modell sehr einfach zu warten wäre.
Hier gibts ein kleines Demoprojekt: Download [VS 2008]
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author bigbasti87
Posted at 10:26 9. Dezember 2009.
Bloggd: VB.NET: Saubere Klassen erstellen mit Propertys – http://blog.bigbasti.com/vb-net-saubere-… #vb #net
Author Ramires Shannar
Posted at 23:41 11. Mai 2010.
Der Eintrag ist zwar schon älter, aber ich habe trotzdem ne Frage: Wieso weisst du in der Sub New me._marke den Wert marke zu und nicht der Property Marke, die dann ja _marke setzten würde…denn so wie du das jetzt gemacht hast hättest du dir die Props sparen können.
Also: Marke = marke
und nicht me._marke = marke
Gruß Ramires
Author admin
Posted at 08:28 12. Mai 2010.
Hallo Ramires,
du hast vollkommen recht, man sollte die dem Konstruktor übergebenen Werte in jedem Fall über die Properties zuweisen.
Danke für den Hinweis, wurde korrigiert!
Author Denix
Posted at 00:11 20. Mai 2010.
Cool! 🙂 …und wie löscht man Einträge aus dem DataGridView und der Klasseninstanz?
Ich komm da echt nich weiter… 🙁
Gruß
Denix
Author Jerry
Posted at 15:08 5. September 2011.
Ja?
Author Anton
Posted at 22:01 22. März 2012.
Wenn ich eine Klasse erzeuge, die von einem Steuerelement, z.B.: Button, abgeleitet ist, diese mit Propertys erstelle und die Klasse im Designer zu ’ner Form hinzufüge, dann sehe ich in der Eigenschaftenseite/ dem Eigenschaftenfenster, die Propertys, darunter auch meine definierten.
Meine eigenen Propertys stehen dabei aber immer in der Kategorie „Sonstiges“
Kann man das ändern? Kann man auch solche Sachen wie Enabled setzen, dass einige Eigenschaften dann grau hinterlegt sind?
Ist es auch möglich, andere, geerbte Propertys aus der Eigenschaftenseite zu „verbannen“?
Author Hermann
Posted at 22:13 17. August 2012.
Du kannst deine eigenen Propertys auch in Kategorien einteilen, indem du vor das „Property …“ einfach (in die vorhergehende Zeile) schreibst:
_
Bei KATEGORIE trägst du halt eine schon vordefinierte Kategorie ein oder gibst einen neuen Namen an, dann erstellt er eine neue Kategorie.
Nur wie das mit dem verbannen geht, weiß ich nicht.
Aber ich denke, es sollte möglich sein, das zu bewerkstelligen 🙂
Author Hermann
Posted at 22:15 17. August 2012.
sorry, hier noch mal richtig:
das musst du vor die Property schreiben:
_