vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: 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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel