| |
VB.NET - Ein- und UmsteigerRe: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 20.02.15 13:10 |
| Manfred X schrieb:
Zitat: | | Erstelle eine Basisklasse "Axis" unbd leite spezifische Achsenklassen davon ab. | |
Damit ersetze ich 'Definition der Achsen
Dim X As New Axis(Axis.Type.A, Port1, "0", 100, 1) 'z.B. vom Typ A
Dim Y As New Axis(Axis.Type.A, Port2, "0", 100, 1) 'z.B. vom Typ A
Dim Z As New Axis(Axis.Type.B, Port3, "0", 100, 1) 'z.B. vom Typ B durch 'Definition der Achsen
Dim X As New AxisA(Port1, "0", 100, 1) 'z.B. vom Typ A
Dim Y As New AxisA(Port2, "0", 100, 1) 'z.B. vom Typ A
Dim Z As New AxisB(Port3, "0", 100, 1) 'z.B. vom Typ B und kann den Typ (A oder B) nicht mehr dynamisch festlegen.
Oder habe ich das falsch verstanden? | |
Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 20.02.15 10:19 |
| Wie kann ich bei der Erzeugung einer neuen Instanz einer Klasse eine Variable definieren (Name fest, Typ aber vorher unbekannt), die dann in der Klasse zur Verfügung steht?
Habe folgendes Beispielprogramm:
Public Class Main
Private Sub Main()
'Definition der Achsen
Dim X As New Axis(Axis.Type.A, Port1, "0", 100, 1) 'z.B. vom Typ A
Dim Y As New Axis(Axis.Type.A, Port2, "0", 100, 1) 'z.B. vom Typ A
Dim Z As New Axis(Axis.Type.B, Port3, "0", 100, 1) 'z.B. vom Typ B, andere
' Routinen nötig
'Befehle zu den Achsen
X.Home()
Y.Home()
Z.Home()
End Sub
End Class Die Klasse Axis sieht so aus:
Von hier werden die Typ-spezifischen Unterroutinen in Klasse A oder Klasse B aufgerufen.
Public Class Axis
Sub New(Typ as .., ByVal Port As SerialPort, ByVal ...)
'Hier wird je nach Typ (A oder B) die Variable Achse definiert
Select Case Typ
Case Type.A
Dim Achse As New A(Port, ,...)
Case Type.B
Dim Achse As New B(Port, ...)
Case Type.Zaber
End Select
End Sub
Sub Home()
'Je nach Typ (A oder B) wird hier die Routine A.Home() oder B.Home()
' aufgerufen
Achse.Home()
End Sub
End Class Wenn ich wie oben die Variable Achse erst im Axis.New() deklariere, ist sie in Axis.Home() nicht bekannt. Wenn ich sie direkt in der Axis Klasse definiere, muss ich aber den Typ vorher kennen?!
Gibt es eine gescheite Lösung? | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 20.02.15 11:47 |
| Erstelle eine Basisklasse "Axis" unbd leite spezifische Achsenklassen davon ab.
| |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 20.02.15 13:45 |
| So funktioniert das Forum nicht!!!
Du mußt erklären was Deine Problem-/Zielstellung ist.
Dann kann die Community auf geeignete Wege hinweisen.
Es gibt auch generische Klassen, Schnittstellen, den Datentyp Object usw ....
Diese diversen Möglichkeiten/Vorgehensweisen, etwas im Programm zu strukturieren,
beziehen sich jeweils auf spezifische Ziel-Typen und haben auch Grenzen.
| |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 20.02.15 14:46 |
| OK, tut mir leid, wenn ich zu wenig Informationen geliefert habe.
Von einem Rechner sollen motorisierte Achsen angetrieben werden. Konkret 3 Stück.
Dabei gibt es unterschiedliche Typen von Achsen, die mit prinzipiell gleichlautenden Befehlen unterschiedliche Routinen zur Ansteuerung brauchen.
Z.B. der Befehl "Move(10)" soll jede Achse zur Position 10 fahren, dahinter stecken aber die typspezifischen Routinen MoveA(), MoveB(), usw.
Während der Laufzeit soll erst festgelegt werden, welche Achsen von welchem Typ angeschossen sind.
Im Hauptprogramm möchte ich die 3 Achsen mit typunabhängigen Befehlen wie folgt ansprechen:
X.Home()
Y.Move(20)
Z.Speed = 100
... Bisher habe ich es so gelöst, dass bei jedem Befehl (Home, ...) mit einer Select Case den Typ der Achse abfrage und dann die entsprechende typspezifische Subroutine (HomeA, HomeB, ...) aufrufe.
Das funktioniert, ist aber bestimmt nicht die eleganteste Methode.
Daher hier mein Ansatz, wie im 1. Posting beschrieben:
Jede Achse ist eine Instanz der Hauptklasse "Axis". Bei der Erstellung der Instanz wird der Motortyp mit übergeben. Dim X As New Axis(Axis.Type.A, Port1) 'z.B. vom Typ A
Dim Y As New Axis(Axis.Type.A, Port2) 'z.B. vom Typ A
Dim Z As New Axis(Axis.Type.B, Port3) 'z.B. vom Typ B Das ist das Ziel!
Damit soll erreicht werden, dass ich beim Aufrufen von Prozeduren (z.B. X.Home) die richtige Routine (z.B. HomeA) aufgerufen wird. Dabei möchte ich aber nicht wie bisher bei jedem möglichen Befehl eine Select-Case-Abfrage haben, sondern nur eine in der New() Prozedur.
Public Class Axis
Sub New(Typ as .., ByVal Port As SerialPort, ByVal ...)
'Hier wird je nach Typ (A, B ,,,, ) die Variable Achse definiert
Select Case Typ
Case Type.A
Dim Achse As New A(Port, ,...)
Case Type.B
Dim Achse As New B(Port, ...)
'....
'.... ca. 6-7 mögliche Achsen-Typen
End Select
End Sub
Sub Home()
'Je nach Typ von "Achse" wird hier die Routine A.Home() oder B.Home()
' ... aufgerufen
Achse.Home()
End Sub
Sub Move()
Achse.Move()
End Sub
'....
'.... ca. 10-15 mögliche Befehle
End Class Nur leider funktioniert das Caseabhänige deklarieren von "Achse" als Instanz unterschiedlicher Klassen nicht.
Ich hoffe, diesmal ist alles etwas nachvollziehbarer ausgedrückt.
| |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 20.02.15 15:13 |
| Hmmm!
x.home()
Was bedeutet X.
Ist das eine bestimmte Achse, oder ein Motor, der eine beliebige Achse enthalten kann,
die über die Home-Methode angesprochen werden soll?
Du kannst eine Schnittstelle deklarieren, die die Achsen-Methoden enthält.
Diese Schnittstelle implementierst Du in den drei Achsen-Klassen (die am besten
von einer gemeinsamen Basisklasse "Achse" abgeleitet werden).
Du kannst dann diese Schnittstelle verwenden, um eine beliebige Achse zu übergeben.
Die spezifischen Methoden der jeweiligen Achse werden dann über die gemeinsame
Schnittstelle angesprochen.
Beispiel:
Public Interface AxisMethods
Sub Home()
End Interface
Public MustInherit Class Axis
Implements AxisMethods
Public MustOverride Sub Home() Implements AxisMethods.Home
End Class
Public Class AxisA
Inherits Axis
Public Overrides Sub Home()
MsgBox("Home in A")
End Sub
End Class
Public Class AxisB
Inherits Axis
Public Overrides Sub Home()
MsgBox("Home in B")
End Sub
End Class
Public Class Motor
Dim _axe As Axis
Public Sub New(axe As Axis)
_axe = axe
End Sub
Public Sub Home()
_axe.Home()
End Sub
End Class Anwendung:
Dim a As New AxisA
Dim m1 As New Motor(a)
m1.Home()
Dim b As New AxisB
Dim m2 As New Motor(b)
m2.Home()
Beitrag wurde zuletzt am 20.02.15 um 15:27:23 editiert. | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 20.02.15 21:26 |
| Danke für den Beispiel-Code. Wieder den OOP-Horizont etwas erweitert!
AxisA und AxisB sind die Hardware-Achsen verschiedener Hersteller.
m1 und m2 sind die Software Achsen, auf die sich im Programm bezogen wird (bei mir X und Y).
Genau so habe ich das gemeint.
Du hast allerdings die feste Zuordnung m1=AxisA und m2=AxisB vorausgesetzt.
Im Programmablauf soll aber jedem Motor eine beliebige Achse zugeordnet werden können, ggf können auch alle Motoren den selben Achsentyp haben.
Genau das ist mein Problem.
'das geht ja leider nicht:
select case typ_m1
case "A": Dim a As New AxisA
case "B": Dim a As New AxisB
end select
select case typ_m2
case "A": Dim b As New AxisA
case "B": Dim b As New AxisB
end select
Dim m1 As New Motor(a)
Dim m2 As New Motor(b)
m1.Home()
m2.Home() | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: sv00010 | Datum: 20.02.15 23:06 |
| Peter S. schrieb:
Zitat: | | Wie kann ich bei der Erzeugung einer neuen Instanz einer
Klasse eine Variable definieren (Name fest, Typ aber vorher
unbekannt), die dann in der Klasse zur Verfügung steht? | |
Vom Prinzip her mit einem generischen Typ.
Public Class Beispiel(Of T)
Sub New(ByVal ValueIN As T)
End Sub
End Class 0 | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 21.02.15 00:28 |
| [I]Im Programmablauf soll aber jedem Motor eine beliebige Achse zugeordnet werden können,
ggf können auch alle Motoren den selben Achsentyp haben. [/I]
Eine Achse zu haben, ist (vermutlich) eine Eigenschaft des Motors.
Public Class Motor
Implements AxisMethods
Dim _axe As Axis
Public Sub New(axe As Axis)
_axe = axe
End Sub
Public Property axe() As Axis
Set(value As Axis)
_axe = value
End Set
Get
Return _axe
End Get
End Property
Public Sub Home() Implements AxisMethods.Home
_axe.Home()
End Sub
End Class Anwendung:
'Achse ab Werk (A)
Dim a As New AxisA
Dim m1 As New Motor(a)
m1.Home()
'Auswechslung der Achse (B)
Dim b As New AxisB
m1.axe = b
m1.Home() Die Sache mit den "Hardware-Achsen" und "Software-Achsen" habe ich nicht verstanden.
Beitrag wurde zuletzt am 21.02.15 um 00:49:11 editiert. | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 21.02.15 06:19 |
| So weit ich das verstehe, hast Du verschiedenartige Schnittstellen zu den Achsen der
diversen Hersteller.
Die Klassen AxisA, AxisB, ... fungieren in diesem Fall als "Wrapper"-Klassen, um
durch Kapselung innerhalb Deines Programms eine einheitliche Objektstruktur zu ermöglichen.
Für jede "Hardware-Achse" wird eine darauf zugeschnittene Kapsel-Klasse benötigt.
Public Class AxisA
Inherits Axis
'eine interne Referenz der fest zugeordneten Hardware-bezogenen Klasse
Private _hwa As HardwareAchseA
'Übergabe einer Instanz von HardwareAchseA
Public Sub New(hwa as HardwareAchseA)
_hwa = hwa
End Sub
Public Overrides Sub Home()
'_hwa.home oder ähnlich
'Aufruf der Methoden von hwa,
'die Home ermöglichen
End Sub
End Class Die "AxisA"-Instanz kann dann in jeden Motor eingebaut werden,
der eine Eigenschaft für die Basisklasse "Axis" bereit stellt
und erlaubt die Steuerung einer zugeordneten Instanz der "HardwareAchseA"
über die Methoden von "AxisA" bzw des Motors, der die Achse enthält.
(Es kann auch alternativ eine "AxisB"-Instanz in den Motor eingebaut werden,
die dann eine zugeordnete Instanz von "HardwareAchseB" steuert.)
| |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: cookstdu | Datum: 21.02.15 10:27 |
| Hallo
Ich würde dieses Pronlem mit Überladung lösen.
Public Class Axis
Private Achse As Object
Sub New(Typ as TypA, ByVal Port As SerialPort, ByVal ...)
End Sub
Sub New(Typ as TypB, ByVal Port As SerialPort, ByVal ...)
End Sub
Sub New(Typ as TypC, ByVal Port As SerialPort, ByVal ...)
End Sub
Sub Home()
End Sub
End Class cu
Wenn alle Stricke rei?en, dann h?ng ich mich auf. ~ Karl Kraus | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 22.02.15 22:08 |
| Vielen Dank für Eure zahlreichen Antworten!
Die Sache mit den abgeleiteten Klassen sieht recht vielversprechend aus.
Wenn ich den Code aus diesem Posting teste http://www.vbarchiv.net/forum/id22_i97475t97469_variablendeklaration-in-classnew-mit-unterschiedlichen-typen.html
kommt aber immer eine Fehlermeldung bei den home() Aufrufen: Deklaration erwartet (m1 bzw m2 als Fehler markiert).
Das mache ich doch ohne Beanstandung eine Zeile drüber ???
Public Class Form 1
Dim a As New AxisA
Dim m1 As New Motor(a)
m1.Home()
Dim b As New AxisB
Dim m2 As New Motor(b)
m2.Home()
End Class | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Manfred X | Datum: 23.02.15 06:07 |
| Hallo!
Auf Klassen-, Formular- oder Modul-Ebene können Instanzen von Klassen oder Strukturen erstellt werden,
die in der gesamten Klasse bzw. dem gesamten Modul Gültigkeit besitzen.
Auch das Einrichten von "Properties" bzw. die Parametrisierung einer neu erstellten Instanz per "New" ist
auf dieser Ebene erlaubt.
Aber:
"Functions" und "Subs" können nur innerhalb des Codes von
"Functions", "Subs" oder "Properties" gerufen werden.
(Es ist zweckmäßig und übersichtlich, im Code geeignete Einrückungen der Blöcke vorzunehmen. )
Public Class Form1
'Formular-Ebene
Dim a As New AxisA
Dim m1 As New Motor(a)
Dim b As New AxisB
Dim m2 As New Motor(b)
Private Sub Form1_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Routinen-Ebene
m1.Home()
m2.Home()
m1.axe = b 'Einbau einer anderen Achse per Property
m1.Home()
End Sub
End Class | |
Re: Variablendeklaration in Class.New mit unterschiedlichen Typen | | | Autor: Peter S. | Datum: 23.02.15 10:02 |
| Manfred X schrieb:
Zitat: | | "Functions" und "Subs" können nur innerhalb des Codes von "Functions", "Subs" oder "Properties" gerufen werden.
| |
Oh, klar! Peinlich!
Jetzt funktioniert es aber genau so, wie ich es mir vorgestellt habe. Habe die Selektion der Achse noch in die Motor-Class eingebaut. Damit wird der Aufruf ganz elegant:
Dim m1 As New Motor("A")
Dim m2 As New Motor("B")
m1.Home()
m2.Home() Motor Class:
Public Class Motor
Implements AxisMethods
Dim _axe As Axis
Public Sub New(ByVal t As String)
Select Case t
Case "A"
Dim a As New AxisA
_axe = a
Case "B"
Dim b As New AxisB
_axe = b
End Select
End Sub
Public Sub Home() Implements AxisMethods.Home
_axe.Home()
End Sub
End Class 1000 Dank für die schnelle und kompetente Hilfe!!! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|