Meine erste Vererbung .... Probleme mit der Bereitststellung von Funktionen aus Oberklasse

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Meine erste Vererbung .... Probleme mit der Bereitststellung von Funktionen aus Oberklasse

    Moin !

    ich habe mich auf den Weg gemacht meine erste Klasse zu vererben.

    Hier zunächst die Unterklasse

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.VisualBasic
    3. Public Class Log
    4. ' ++++++++++ http://ma22-wiki-001/eblwiki/index.php?title=AcLog_(Klasse_von_EBL.Service) ++++++++++
    5. Inherits EBL.Logger.Log
    6. Private _AcDocument As Autodesk.AutoCAD.ApplicationServices.Document
    7. Private _Editor As Autodesk.AutoCAD.EditorInput.Editor
    8. Private _LOGFILEPATH As String = ""
    9. Private _TryReport As EBL.Service.TryCatchReport
    10. ''' <summary>
    11. ''' Anlegen einer neuen Instanz
    12. ''' </summary>
    13. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    14. Public Sub New()
    15. MyBase.New()
    16. AcReInit()
    17. '_DebugStatus = _Optionen.GetDebugStatus()
    18. _LOGFILEPATH = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("LOGFILEPATH")
    19. '_TryReport = New EBL.Service.TryCatchReport
    20. End Sub
    21. 'Update der Verbindung zur aktuellen DWG
    22. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    23. Private Sub AcReInit()
    24. 'TODO: Add constructor logic here
    25. Try
    26. _AcDocument = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
    27. _Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
    28. Catch ex As System.Exception
    29. _TryReport.Show("unvorhergesehener Fehler in EBL.Service > Script > AcReInit", ex.ToString)
    30. MsgBox("unvorhergesehener Fehler in EBL.Service > Script > AcReInit" & vbCrLf & vbCrLf & ex.ToString)
    31. End Try
    32. End Sub
    33. Public Sub test()
    34. MsgBox("testausgabe")
    35. End Sub
    36. End Class


    dann der Anfang aus der Oberklasse.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.VisualBasic
    3. Public Class Log
    4. ' ++++++++++ http://ma22-wiki-001/eblwiki/index.php?title=Log_(Klasse_von_EBL.Service) ++++++++++
    5. Const _k_DebugStatus As Boolean = False
    6. 'Private _Optionen As EBL.Optionen.Options
    7. Private _LOGFILEPATH As String = ""
    8. Private _OutputLogFile As Boolean = False
    9. Private _OutputScreen As Boolean = True
    10. Private _TryReport As EBL.Service.TryCatchReport
    11. Private _LogFileName As String
    12. Private _LineCounter As Long
    13. Private _TotalErrCount As Integer = 0 'Anzahl Fehlermeldungen
    14. Private _IgnoreLogWrite As Boolean = False
    15. Private _DialogHeader As String = ""
    16. ''' <summary>
    17. ''' Anlegen einer neuen Instanz
    18. ''' </summary>
    19. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    20. Public Sub New()
    21. ''- AcReInit()
    22. '_DebugStatus = _Optionen.GetDebugStatus()
    23. ''- _LOGFILEPATH = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("LOGFILEPATH")
    24. _TryReport = New EBL.Service.TryCatchReport
    25. _LogFileName = "EBL_Fehlersuche.log" ' StandardName
    26. _DialogHeader = k_CompanyName
    27. ReSetFileCount()
    28. End Sub


    Ein Verweis aus der Unterklasse auf die Oberklasse ist gesetzt.

    Das Problem ist nun, dass nach dem Einbinden der neuen Unterklasse zwar die Test-Funktion angeboten wird.

    Andere Funktionen aus der Oberklasse werden aber nicht angeboten.

    Hier Code aus der Oberklasse:

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    2. Public Sub WriteAsError(ByVal Ausgabetext As String, Optional ByVal AppendData As Boolean = True, Optional ByVal AddErrCount As Boolean = True, _
    3. Optional CountCrlf As Integer = 1, Optional ShowInfoDialog As Boolean = False, Optional CallAdmin As Boolean = False)
    4. If CountCrlf < 1 Then CountCrlf = 1
    5. If ShowInfoDialog = True Then
    6. If CallAdmin = True Then Ausgabetext += vbCrLf & vbCrLf & "Bitte informieren Sie umgehend Ihren CAD-Admin!!"
    7. MsgBox(Ausgabetext, MsgBoxStyle.Critical, _DialogHeader)
    8. End If
    9. If _k_DebugStatus = True Then
    10. WriteLogData("Log: " & Ausgabetext, AppendData, CountCrlf)
    11. Else
    12. WriteLogData("**** Fehler ****", AppendData, False, 1)
    13. WriteLogData(Ausgabetext, AppendData:=AppendData, AddErrCount:=AddErrCount, CountCrlf:=CountCrlf)
    14. End If
    15. End Sub


    Habe ich da vielleicht etwas übersehen - kann mir einer weiterhelfen?

    Gruß Jan

    PS: eine Ergänzung noch. Wenn ich mybase. eingebe, dann werden mir ALLE Funktionen aus der Oberklasse angeboten!!! Das verstehe ich irgendwie nochweniger.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    @jan99 Solange beide Klassen Log heißen, kann da wer weiß was passieren im Sinne von Missverständnisen zwischen beiden Klassen.
    Räum mal die Namen auf und poste dann beide Klassen, die Prozeduren können ja leer sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin !

    ich habe jetzt die Klassen nochmal umbeannt etc.

    Oberklasse

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.VisualBasic
    3. Public Class Log
    4. ' ++++++++++ http://ma22-wiki-001/eblwiki/index.php?title=Log_(Klasse_von_EBL.Service) ++++++++++
    5. Const _k_DebugStatus As Boolean = False
    6. Protected _LOGFILEPATH As String = ""
    7. ''' <summary>
    8. ''' Anlegen einer neuen Instanz
    9. ''' </summary>
    10. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    11. Public Sub New()
    12. _TryReport = New EBL.Service.TryCatchReport
    13. _LogFileName = "EBL_Fehlersuche.log" ' StandardName
    14. _DialogHeader = k_CompanyName
    15. ReSetFileCount()
    16. End Sub
    17. ''End Sub
    18. ''' <summary>
    19. ''' aktivieren des LineCounters
    20. ''' </summary>
    21. ''' <remarks>setzt den Wert=0</remarks>
    22. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    23. Public Sub LineCounterOn()
    24. _LineCounter = 0
    25. End Sub
    26. End Class


    ... dann die Unterklasse

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.VisualBasic
    3. Public Class AcLog
    4. Inherits EBL.Logger.Log
    5. Private _AcDocument As Autodesk.AutoCAD.ApplicationServices.Document
    6. Private _Editor As Autodesk.AutoCAD.EditorInput.Editor
    7. ''' <summary>
    8. ''' Anlegen einer neuen Instanz
    9. ''' </summary>
    10. <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    11. Public Sub New()
    12. MyBase.New()
    13. AcReInit()
    14. '_DebugStatus = _Optionen.GetDebugStatus()
    15. _LOGFILEPATH = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("LOGFILEPATH")
    16. '_TryReport = New EBL.Service.TryCatchReport
    17. End Sub
    18. Public Sub test()
    19. MsgBox("testausgabe")
    20. End Sub
    21. End Class


    Dann noch einen "Blick" bei der Einbindung...

    VB.NET-Quellcode

    1. Imports System
    2. Public Class InspCrawler
    3. Private _Log As New EBL.AcadLogger.AcLog
    4. ....


    Der Verweis ist gesetzt und hier noch einmal die Anzeige, was _Log an Funktionen anbietet.



    Helfen diese Angaben weiter ?

    Gruß Jan

    jan99 schrieb:

    Dann noch einen "Blick" bei der Einbindung...

    VB.NET-Quellcode

    1. Imports System
    2. Public Class InspCrawler
    3. Private _Log As New EBL.AcadLogger.AcLog
    4. ....



    Der Verweis ist gesetzt und hier noch einmal die Anzeige, was _Log an Funktionen anbietet.
    ja, was solls?
    Wenn du dir ein AcLog-Objekt erstellst, da kannste lange warten, bis der die Methoden eines Log-Objektes anbietet.

    Die Child-Klasse beerbt die Parent-Klasse - nicht umgekehrt.
    Moin!

    ich stehe auf dem Schlauch und verstehe das nicht.

    Nach meinem Verständnis ....

    Mit dem Inherits EBL.Logger.Log in der AcLog müssen doch in diese die Funktionen wie LineCounterOn aufgenommen werden und somit auch angeboten werden.

    Ob nun in der InspCrawler das teil _Log oder Horst heißt

    VB.NET-Quellcode

    1. Public Class InspCrawler
    2. Private _Log As New EBL.AcadLogger.AcLog


    müssen doch im Kontext von _Log auch die Funktionen wie LineCounterOn bereitgestellt werden ...????

    Mache mir doch einmal einer das Licht an!

    Gruß Jan
    Du erbst von der Klasse EBL.Logger.Log. Die Basisklasse welche du in Post #4 aber angegeben hast hat aber keinen Namespace. Falls hier nicht der Default Namespace zieht erbst du eventuell von der falschen Klasse wenn zufälligerweise noch eine Klasse "Log" existiert.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Moin!

    langsam vermute ich die Richtung meines Fehlers. Aber das mit den Namespaces habe ich immer noch nicht so ganz verstanden.

    In der AcadLogger habe ich als Stammnamespace "EBL.AcadLogger" angegeben.

    In der Logger habe ich entsprechend "EBL.Logger" angegeben.

    Liegt hier der Fehler?

    Aber testweise habe ich in der AcadLogger als Stammnamespace "EBL.Logger" eingetragen.

    Aber dann ist schon

    VB.NET-Quellcode

    1. Private _Log As New EBL.AcadLogger.AcLog


    als fehlerhaft angemerkt! Unter anderem wird mir

    VB.NET-Quellcode

    1. Private _Log As New EBL.Logger.AcLog


    vorgeschlagen - aber dann wird mir auch nicht mehr angeboten!

    Ich stehe wieder im Wald - war wohl nur eine Lichtung.

    Gruß Jan
    Moin!

    ja, das ist die bei #4 genannt Klasse Public Class Log.

    Auch wieder für mich alles ok - aber ich verstehe es einfach immer noch nicht!

    Bei uns in der Schule hieß es immer "was will der Autor uns damit sagen" .... und wieder habe ich diesen einmal nicht verstanden!

    Jan

    jan99 schrieb:

    Bei uns in der Schule hieß es immer "was will der Autor uns damit sagen" .... und wieder habe ich diesen einmal nicht verstanden!
    Damit wollte ich nur schauen, ob du von der richtigen Klasse erbst.

    Aber ich glaube wir brauchen mehr Code von um den Fehler zu erkennen, sonst wird es schwer weiter zu helfen, denn wenn ich bei mir die ganzen Kommentare mal weg machen Funktioniert es im Prinzip. Du hast also doch noch irgendwas mit den Namespaces verquer oder etwas anderes, was wir vermutlich nicht sehen.

    @jan99 Wenn sich beide Klassen im selben Namespace befinden, lass den Namespace weg.
    Variablen und Prozeduren sollten schon mal deklariert sein.
    Bei so viel fehlenden Deklarationen lässt es sich nur schwer helfen, da wir nicht wissen, wo die in einer Philosophie hingehören.
    AutoCAD hat auch nicht jeder ...
    Vielelicht übst Du mal die Vererbung an einem einfachen Objekt:

    Quellcode

    1. Fahrzeug - 4-Rad - PKW
    2. Fahrzeug - 4-Rad - LKW
    3. Fahrzeug - 2-Rad - Motorrad
    4. Fahrzeug - 2-Rad - Fahrrad

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    mehr kann ich jetzt wiederum erst morgen liefern!

    Aber bis auf die zwei-drei Variablen die sich in der Unterklasse in #4 auf Autocad beziehen stecken da nicht mehr drin.

    Kann ich morgen zusätzlich Inhalte von bestimmten Dateien Posten um den Aufbau der Namespaces aufzuzeigen?

    Ich hatte ja heute schon einmal die Definitionen versucht aufzuzeigen.

    Jan

    Musterdaten ...

    Moin!

    ich habe den Code der Logger und AcLogger einmal als Zip gepackt.

    Hoffentlich ist das alles so ausreichend.

    Die Verweise (auch AutoCAD) sind noch vorhanden.

    Gruß Jan
    Dateien