Zuweisungen von Klassen

Alle Themen rund um die Erstellung von Programmen
FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Zuweisungen von Klassen

Beitrag von FDominicus »

Zu meinen Entsetzen habe ich festgestellt: Ich kann einem Elternobjekt kein Kindobjekt zuweisen.

Beispiel:
AClass is a Class

BClass is a Class
inherits Aclass

nun geht ein

AClass = new BClass nicht

Ich kenne sonst keine Programmiersprache wo diese Zuweisung unzulässig wäre. Den einzigen Weg da herum habe ich über Variant gefunden.

Ist das korrekt oder habe ich etwas bei der WLanguage übersehen?

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

Leider ist es noch schlimmer

AClass is Class
m_Element is variant



Element (vValue is variant)
m_Element = vValue


geht nicht wenn man folgendes macht

clClass = new AClass

clClass.Element = new AClass

Was geht ist

clClass.m_Element = new AClass


Das ist nicht schlecht das ist richtig schlecht. Properties kann man so nicht verwenden und man kann keine Lösung objktorientiert aufbauen. Weil die Zuweisungen von Kinderklassen and Elternklassen nicht funktioniert. Das ist unglaublich schlecht....

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Herbert »

Ich weiss zu wenig, warum du das so machst. Ich erstelle meine Klassen im Projekt, nicht im Code.

Was du meinst ist die Class inheritance, welche von der angegebenen Klasse erbt und als Subclass erscheint.
https://doc.pcsoft.fr/en-US/?6010007&na ... product=WD

In der Subclass werden nur Neue Elemente definiert, die anderen sind ja von Haus an schon da.

Aber wie gesagt, ich verstehe zu wenig, was du genau machen willt.

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Lewi »

FDominicus hat geschrieben:Zu meinen Entsetzen habe ich festgestellt: Ich kann einem Elternobjekt kein Kindobjekt zuweisen.

Beispiel:
AClass is a Class

BClass is a Class
inherits Aclass

nun geht ein

AClass = new BClass nicht

Ich kenne sonst keine Programmiersprache wo diese Zuweisung unzulässig wäre. Den einzigen Weg da herum habe ich über Variant gefunden.

Ist das korrekt oder habe ich etwas bei der WLanguage übersehen?
Ein Klassenobjekt, egal ob "Local", "Privat" oder "Global, darf in WinDEV nicht den gleichen Namen einer existierenden Klasse haben. Ich sehe hier überhaupt kein Problem und kann damit leben.

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Lewi »

FDominicus hat geschrieben:Leider ist es noch schlimmer
AClass is Class
m_Element is variant

Element (vValue is variant)
m_Element = vValue

geht nicht wenn man folgendes macht

clClass = new AClass
clClass.Element = new AClass

Was geht ist

clClass.m_Element = new AClass

Das ist nicht schlecht das ist richtig schlecht. Properties kann man so nicht verwenden und man kann keine Lösung objktorientiert aufbauen. Weil die Zuweisungen von Kinderklassen and Elternklassen nicht funktioniert. Das ist unglaublich schlecht....
Deine Aussage ist, mit Verlaub, "bull shit". Dein Beispiel macht für mich auch keinen Sinn, weil die Member-Vartiable durch die Zuweisung widerrum zum Klassenobjekt der selben Klasse wird.


Das OOP mit WinDev ganz easy ist, soll Dir nachfolgendes Beispiel veranschaulichen:


Beispiel:
//------------------------------- Filename

Code: Alles auswählen

FileName is a Class
	Name is string
	Extension is string
	Directory is string
END

PROCEDURE Constructor(sFile is string)
	Name 		= fExtractPath(sFile, fFileName)
	Directory 	= fExtractPath(sFile, fDrive + fDirectory)
	Extension	= fExtractPath(sFile, fExtension)

PROCEDURE Destructor()
RETURN

// Methode "Display", um Datenauzugeben
PROCEDURE Display()
	Trace(Name)
	Trace(Directory)
	Trace(Extension)
RETURN	
//------------------------------- FileInfo

Code: Alles auswählen

FileInfo is a Class
	inherits from FileName              // erbt die Klasse "FileName"
 	FileSize is int
	FileCreation is string
	FileModify is string
	FileAccess is string
END
PROCEDURE Constructor( sFile is string)
	Constructor FileName(sFile)         // Der Klasse FileName den Dateinamen mitteilen, um dort die Member-Variablen die Daten zuzuweisen 
	FileSize 		= fSize(sFile)
	FileCreation	= fDate(sFile, "", fCreation)
	FileAccess 		= fDate(sFile, "", fAccess) 
	FileModify		= fDate(sFile, "", fModify) 

PROCEDURE Destructor()

//Methode Display um Daten FileInfo-Klasse und der geerbten Klasse auszugeben.
PROCEDURE Display()
	Ancestor:Display()       // oder auch:	FileName:Display() möglich
	Trace( "FileSize           : " + NoSpace(NumToString(FileSize,"10.0FS")) + " Byte")
	Trace( "Angelegt am  : " + DateToString(FileCreation,"DD.MM.YYYY"))
	Trace( "Letzter Zugriff : " + DateToString(FileAccess,"DD.MM.YYYY"))	
	Trace( "Letze Aktuali.: " + DateToString(FileModify,"DD.MM.YYYY"))
RETURN
Hier nun ein Test, um alle Dateinformation für ein Datei in einem Edietifeld "SLE_FILE" anzuzeigen, einscließlich der Daten der Klasse FileName:

Code: Alles auswählen

clSFilePath is FileInfo(SLE_File..Value)
clSFilePath:Display()
Viele Grüße
Olaf

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

Lewi hat geschrieben:
FDominicus hat geschrieben:Leider ist es noch schlimmer
AClass is Class
m_Element is variant

Element (vValue is variant)
m_Element = vValue

geht nicht wenn man folgendes macht

clClass = new AClass
clClass.Element = new AClass

Was geht ist

clClass.m_Element = new AClass

Das ist nicht schlecht das ist richtig schlecht. Properties kann man so nicht verwenden und man kann keine Lösung objktorientiert aufbauen. Weil die Zuweisungen von Kinderklassen and Elternklassen nicht funktioniert. Das ist unglaublich schlecht....
Deine Aussage ist, mit Verlaub, "bull shit". Dein Beispiel macht für mich auch keinen Sinn, weil die Member-Vartiable durch die Zuweisung widerrum zum Klassenobjekt der selben Klasse wird.


Das OOP mit WinDev ganz easy ist, soll Dir nachfolgendes Beispiel veranschaulichen:


Beispiel:
//------------------------------- Filename

Code: Alles auswählen

FileName is a Class
	Name is string
	Extension is string
	Directory is string
END

PROCEDURE Constructor(sFile is string)
	Name 		= fExtractPath(sFile, fFileName)
	Directory 	= fExtractPath(sFile, fDrive + fDirectory)
	Extension	= fExtractPath(sFile, fExtension)

PROCEDURE Destructor()
RETURN

// Methode "Display", um Datenauzugeben
PROCEDURE Display()
	Trace(Name)
	Trace(Directory)
	Trace(Extension)
RETURN	
//------------------------------- FileInfo

Code: Alles auswählen

FileInfo is a Class
	inherits from FileName              // erbt die Klasse "FileName"
 	FileSize is int
	FileCreation is string
	FileModify is string
	FileAccess is string
END
PROCEDURE Constructor( sFile is string)
	Constructor FileName(sFile)         // Der Klasse FileName den Dateinamen mitteilen, um dort die Member-Variablen die Daten zuzuweisen 
	FileSize 		= fSize(sFile)
	FileCreation	= fDate(sFile, "", fCreation)
	FileAccess 		= fDate(sFile, "", fAccess) 
	FileModify		= fDate(sFile, "", fModify) 

PROCEDURE Destructor()

//Methode Display um Daten FileInfo-Klasse und der geerbten Klasse auszugeben.
PROCEDURE Display()
	Ancestor:Display()       // oder auch:	FileName:Display() möglich
	Trace( "FileSize           : " + NoSpace(NumToString(FileSize,"10.0FS")) + " Byte")
	Trace( "Angelegt am  : " + DateToString(FileCreation,"DD.MM.YYYY"))
	Trace( "Letzter Zugriff : " + DateToString(FileAccess,"DD.MM.YYYY"))	
	Trace( "Letze Aktuali.: " + DateToString(FileModify,"DD.MM.YYYY"))
RETURN
Hier nun ein Test, um alle Dateinformation für ein Datei in einem Edietifeld "SLE_FILE" anzuzeigen, einscließlich der Daten der Klasse FileName:

Code: Alles auswählen

clSFilePath is FileInfo(SLE_File..Value)
clSFilePath:Display()
Viele Grüße
Olaf
Hast Du das Beispiel ausprobiert? Das ist ein Polymorphes Assgignment. Und wenn Du meinst es klappt bei Dir dann erkläre mir wie Du es hinbekommst.
In jeder "objektorientierten" Sprache ist es möglich Nachfolgerklassen Vorgängerklasse zu zuweisen. Und genau das geht nicht. Also definiere eine Klasse
AClass is a Class

END


inherits AClass
END



in einem Window kannst Du schreiben:
clA is AClass
cB is BClass

clA = new BClass
cB = new BClass

Und in jeder vernünftigen OO-Sprache geht. Also zeig mir wie das geht und dann können wir mal über "bull shit "reden.

Die Fehlermeldung ist eindeutig:
Error at line 4 of Click Test_Assignment process.
An object of 'BClass' class cannot be assigned in an object of 'AClass' class.

----- Technical Information -----

Project : ObjectAssignment

WL call:
Process of 'Click Test_Assignment' (Win_Main.Test_Assignment), line 4, thread 0

What happened?
An object of 'BClass' class cannot be assigned in an object of 'AClass' class.

Error code: 2406
Level: fatal error

Dump of the error of 'wd220vm.dll' module (22.0.219.4).
Identifier of detailed information (.err): 2406
Additional Information:
EIT_PILEWL :
Click Test_Assignment (Win_Main.Test_Assignment), line 4
EIT_DATEHEURE : 13/06/2017 10:33:01
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <18>



Fall es interessiert für was es gut ist: Stelle die eine Prozeur mach_was vor.
mach_was von Klasse A macht was anderes wie das von Klasse B aber alle könnte mit

eine Klasse.mach_was aufgerufen werden und ich bekäme bei einer funktionierenden polymorphen Zuwweisung genau was ich will eine Änderung des Verhaltens einer Klasse

Damit kann man einmal einen Alorithmus implementieren der glech abläuft aber z.B. speziellere Arbeiten für bestimmt Klassen ausführt.
Danke

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

Lewi hat geschrieben:[

Ein Klassenobjekt, egal ob "Local", "Privat" oder "Global, darf in WinDEV nicht den gleichen Namen einer existierenden Klasse haben. Ich sehe hier überhaupt kein Problem und kann damit leben.
Darum geht es gar nicht
Definiere ein Klasse
AClass is a Class

END

definiere eine abgeleitete Klasse:
BClass is a Class
inherits AClass
END


Definiere in einer Prozedur:
clA is AClass
cB is BClass

clA = new BClass
cB = new BClass

Und dann bekommst Du von WinDev eine Fehlermeldung. Und das ist Mist. Kannst Du gerne mal so in jeder andere OO Sprache machen und wirst sehen, dort klappt es ohne Probleme, und das ist richtig.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Herbert »

Bleibt nett mieinander :angel:

Falls dich dieser Umstand stört, melde dies dem Support von PC-Soft. Dazu sind die Leute dort da und du bekommst auch recht schnell Antwort. Du kannst auf französisch oder Englisch schreiben.
Menü Home/Help/Request to technical support.

In deinem Beispiel definerst du clA als ClasseA und cB als Subclass von KlasseA. Die zweite Zuweisung nachher kann meiner Meinung nach nicht viel Sinn machen, da du cB erneut definieren willst, obwohl diese bereits als solche besteht. Die letzte Linie "cB=new BClass" kannst ganz einfach weglassen und du hast bereits das Gewünschte.

Was ich nicht ganz verstehe: wieso schreibst du im Code eine Klasse? Für mich sind Klassen stets Objekte, welche mehrfach verwendet werden können. Daher definiere ich diese ausschliesslich im Projekt.

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Lewi »

Definiere in einer Prozedur:
cA is AClass
cB is BClass

cA = new BClass
cB = new BClass
Und dann bekommst Du von WinDev eine Fehlermeldung. Und das ist Mist. Kannst Du gerne mal so in jeder andere OO Sprache machen und wirst sehen, dort klappt es ohne Probleme, und das ist richtig.
Die ersten beiden Anweisungen definieren und instanzieren dlA und cV als Klassenobjekte von ACLASS und BClass. Die beiden nachfolgenden Anweisungen sind nicht erforderlich bzw. falsch, da es sich bereits um Klassenobjekte handelt.
Richtig wäre folgendes:

Code: Alles auswählen

cA is dynamic 
cB is dynamic

cA = new AClass( sFileName)
cB = new BClass( (sFileName)
Gruß Olaf

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von BRANDELH »

Hallo miteinander ...

was OO Sprachen alles können hängt sehr von deren Umsetzung und noch mehr von der Herkunft der Entwickler ab.

Wir stammen aus der prozeduralen Welt (dBase, Cli**er, Xbase++ / PowerBasic) und freuen uns über Klassen, mit denen wir Objekte erstellen die uns helfen das zu tun was wir wollen.

Für einen Entwickler der von Smalltalk oder Java kommt sieht die Welt wohl anders aus.

Wie auch immer, muss man sich an die Regeln halten, die die jeweilige Entwicklungsumgebung vorgibt.

Jammern nützt nix. ;-)

Fehler melden manchmal, aber häufig wird das was einer als Fehler ansieht von der Firma als Feature verkauft :angel:

https://de.wikipedia.org/wiki/Objektori ... rammierung
https://de.wikipedia.org/wiki/Liste_obj ... ersprachen

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

Lewi hat geschrieben:
Definiere in einer Prozedur:
cA is AClass
cB is BClass

cA = new BClass
cB = new BClass
Und dann bekommst Du von WinDev eine Fehlermeldung. Und das ist Mist. Kannst Du gerne mal so in jeder andere OO Sprache machen und wirst sehen, dort klappt es ohne Probleme, und das ist richtig.
Die ersten beiden Anweisungen definieren und instanzieren dlA und cV als Klassenobjekte von ACLASS und BClass. Die beiden nachfolgenden Anweisungen sind nicht erforderlich bzw. falsch, da es sich bereits um Klassenobjekte handelt.
Richtig wäre folgendes:

Code: Alles auswählen

cA is dynamic 
cB is dynamic

cA = new AClass( sFileName)
cB = new BClass( (sFileName)
Gruß Olaf
Darum geht es nicht es geht darum, daß man in jeder vernünftigen und brauchbare OO-Sprache eine Nachfolger dem Vorgänger zuweisen kann. Und darauf basieren die meisten Rezepte im GoF Buch. Das geht mit W-Language nicht und das macht Sie zu einer völlig unbrauchbaren OO-Sprache. Und ja der Support hat mir bestätigt, daß die Zuweisung nicht geht und die Begründung war "abenteuerlich". Gegen jedes Konzept einer OO -Sprache. Sogar Visual Basic for Applications kann das.

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

BRANDELH hat geschrieben:Hallo miteinander ...

was OO Sprachen alles können hängt sehr von deren Umsetzung und noch mehr von der Herkunft der Entwickler ab.

Wir stammen aus der prozeduralen Welt (dBase, Cli**er, Xbase++ / PowerBasic) und freuen uns über Klassen, mit denen wir Objekte erstellen die uns helfen das zu tun was wir wollen.

Für einen Entwickler der von Smalltalk oder Java kommt sieht die Welt wohl anders aus.

Wie auch immer, muss man sich an die Regeln halten, die die jeweilige Entwicklungsumgebung vorgibt.

Jammern nützt nix. ;-)

Fehler melden manchmal, aber häufig wird das was einer als Fehler ansieht von der Firma als Feature verkauft :angel:

https://de.wikipedia.org/wiki/Objektori ... rammierung
https://de.wikipedia.org/wiki/Liste_obj ... ersprachen

Sorry, eine solche Selbstverständlichkeit die nicht funktioniert, kann niemand erwarten. Und ja man muß sich an die Regeln halten, nur damit wird schlicht und einfach gelogen. Denn W-Language ist keine OO-Sprache, dann kann ich jetzt auch bezweifeln ob die Sachen mit den three-tier Konstruktion hilft. Also kann ich Windev nur als ein "glorifiziertes" X-Base benutzen. Wäre nett wenn man solche Sachen vor der Nutzung wissen hätte können. Und ja dieser Fehler wurde gemeldet und als Feature verkauft wegen Typsicherheit, was an Lächerlichkeit schwerlich zu überbieten ist. Ich habe mir mal aus Jux-und-Dollerei das ganze in C# umgesetz und klar läuft, läuft auch in Visual Bascic for Appllications, Smalltalk, Eiffel, C++, Objective-C und jeder anderen OO-Sprache. Was daran so schwierig sein kann dieses grundlegende Prinzip von OO-Sprachen zu untertützen, kann wohl nur PC-Soft beantworten. Aber hey es ist kein Bug sondern ein "Feature"

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Zuweisungen von Klassen

Beitrag von FDominicus »

Wahrscheinlich kann man um diesen eklatanten Bruch von OO-Prinzipien mit Indirektionen herum programmieren. Dann hat man eben statt eine Funktion format(): string mehrere Methoden wie
format_Zahl, format_Date etc und wählt dann ausgehend vom Typ die passende Erweiterung an. Es bleibt eine Krücke und es ist - sorry armselig.

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Lewi »

Armselig?!
Dieses Prädikat trifft augenscheinlich auf Deine Argumente zu.
In Unkenntnis Deiner Programmierkenntnisse mit WinDev kommt Du z.B. zum Schluss ...
Dann hat man eben statt eine Funktion format(): string mehrere Methoden wie
format_Zahl, format_Date etc und wählt dann ausgehend vom Typ die passende Erweiterung an.
In WinDev können Parameter in Funktionen und Methoden auf deren Typ hin untersucht, spezifiziert und weiter verarbeitet werden. Nichts anders macht man in C++ mittels "decltyp“ und Weiterleitungsfunktionen. In C++ müssen z.B. Funktions-Parameter immer typisiert (wie "int", "string" usw.) werden, in WinDev nicht.

Abgesehen davon habe ich von Dir noch nichts gelesen, was für mich in Bezug auf Unzulänglichkeiten der Object-Programmierung mit WinDev irgendein Sinn ergibt. Deine Beispiele sind grottenschlecht und sinnfrei. Im Übrigen hättest Du im Vorfeld mit der Free-Version schon feststellen können, dass die Objekt-Programmierung nicht Deinen Ansprüchen genügt.

Gruß Olaf

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Zuweisungen von Klassen

Beitrag von Herbert »

Lewi hat geschrieben: Die ersten beiden Anweisungen definieren und instanzieren dlA und cV als Klassenobjekte von ACLASS und BClass. Die beiden nachfolgenden Anweisungen sind nicht erforderlich bzw. falsch, da es sich bereits um Klassenobjekte handelt.
Richtig wäre folgendes:
Wie Olaf und ich auch schon schrieb: diese erneute Zuweisung ist nicht notwendig, da die Typisierung bereits eine Klasse erstellt. Windev macht eben alles einfacher.
Und ... alle Windev-Programmierer programmieren OO, auch wenn dies nicht bemerkt wird, indem jedes GUI-Element intern aus Klassen hergeleitet wird. Damit arbeiten wir doch primär.

Dui hast immer noch nicht gesagt, was du denn eigentlich programmieren möchtest.

Antworten