"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
Verwijderd
tthread.create(false), maak daar eens (true) van..
"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
1
| MyThreadje := TMyThread.Create(true, 'ikke'); |
Na deze code is MyThreadje nil en dat komt omdat in de create:
1
2
3
4
5
| constructor TMyThread.Create(AutoStart: boolean; const Naam: string); begin inherited Create(AutoStart); MijnName := Naam; end; |
Het na 'inherited Create(AutoStart);' fout gaat.
[ Voor 56% gewijzigd door Parcye op 26-01-2003 20:41 ]
"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
1
| procedure Execute; override; |
Let dan ook op de warnings, want deze geven aan dat je je override vergeten bent: '[Warning] Unit2.pas(13): Method 'Execute' hides virtual method of base type 'TThread''
[ Voor 18% gewijzigd door LordLarry op 26-01-2003 20:57 ]
We adore chaos because we like to restore order - M.C. Escher
"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
We adore chaos because we like to restore order - M.C. Escher
"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
We adore chaos because we like to restore order - M.C. Escher
LordLarry schreef op 26 January 2003 @ 20:55:
Die EAbstractError error krijg je als je een instantie maakt van een klasse waar nog abstracte functies inzitten. De abstracte functie in een TThread is de Execute. Die heb je geoverride neem ik aan, want anders heeft de thread geen nut. Heb je de declaratie wel goed gedaan? Niet misschien de override; vergeten?Delphi:
1 procedure Execute; override;
Let dan ook op de warnings, want deze geven aan dat je je override vergeten bent: '[Warning] Unit2.pas(13): Method 'Execute' hides virtual method of base type 'TThread''
Mocht je ergens een functie vergeten zijn te overriden in die inherited class, dan zou de compiler toch al gaan klagen als hij ziet dat je een object maakt van die inherited class, die toch nog abstract is doordat je een functie vergeten te overriden hebt, ipv at runtime een exceptie te gooien.
[ Voor 5% gewijzigd door whoami op 26-01-2003 21:25 ]
https://fgheysels.github.io/
Nee, helaas. In sommige gevallen krijg je idd een warning, maar het compilen werkt gaat gewoon door. Het idee hierachter is dat je gewoon alles met die instantie kan doen, zolang je maar die abstracte functie niet aanroept. Als je dat wel doet krijg je dus die EAbstractError Exceptie.whoami schreef op 26 January 2003 @ 21:25:
Mocht je ergens een functie vergeten zijn te overriden in die inherited class, dan zou de compiler toch al gaan klagen als hij ziet dat je een object maakt van die inherited class, die toch nog abstract is doordat je een functie vergeten te overriden hebt, ipv at runtime een exceptie te gooien.
Parcye: Je roept toch niet de inherited van de Execute aan toch? Die is er niet en zou ook een EAbstract kunnen geven.
We adore chaos because we like to restore order - M.C. Escher
"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002
We adore chaos because we like to restore order - M.C. Escher
Hmm, dat vind ik vreemd.... Ik heb Delphi hier nu niet staan, maar ga dat toch ff moeten uittesten.LordLarry schreef op 26 januari 2003 @ 21:38:
[...]
Nee, helaas. In sommige gevallen krijg je idd een warning, maar het compilen werkt gaat gewoon door. Het idee hierachter is dat je gewoon alles met die instantie kan doen, zolang je maar die abstracte functie niet aanroept. Als je dat wel doet krijg je dus die EAbstractError Exceptie.
Normaal gezien is iedere class die -al is het er maar 1- abstracte functies bevat een abstracte class, en zou je de constructor er dus niet mogen kunnen van aanroepen, en zou je al een compiler error krijgen.
Bv in dit code-voorbeeld (dit is wel C#, aangezien ik hier Delphi niet installed heb):
1
2
3
4
5
6
7
8
9
10
| abstract class Test
{
Test()
{
}
public abstract void DoeIets();
}
Test t = new Test(); |
Dit compileert niet, en dan krijg je volgende error:
Indien dat mocht lukken in Delphi, dan zou ik dat toch echt een slecht punt vinden voor Delphi.D:\NeoISD\cfgCategories.aspx.cs(60): Cannot create an instance of the abstract class or interface 'NeoISD.test'
Van zodra er een abstracte functie in een class zit, is die class imho abstract en mag je er geen objecten van kunnen instantieren.
Parcye: Je roept toch niet de inherited van de Execute aan toch? Die is er niet en zou ook een EAbstract kunnen geven.
Misschien een foutje in Delphi 5, dat als je een abstracte functie overrided, het keyword inherited ook automatisch in die functie body komt....
https://fgheysels.github.io/
Integenstelling tot o.a. Java, C++ en C# is dit niet het geval bij Delphi. De Delphi compiler laat je dus wel classes instantieren die abstracte functies bevatten en geven bij de aanroep van zo'n abstracte functie een exceptie. Wel wordt er een compiler warning gegeven dat men hier een abstracte classe wil instantieren. Als argument wordt gegeven dat Delphi op deze manier felixbler is en door de compiler warning toch waarschuwd voor een mogelijk probleem. Runtime referenties naar classen die dan geinstantieerd worden maken het ook lastiger voor de compiler tijdens compile time om altijd te achterhalen of er een abstracte klasse geinstantieerd dreigt te worden.whoami schreef op 27 January 2003 @ 09:16:
Hmm, dat vind ik vreemd.... Ik heb Delphi hier nu niet staan, maar ga dat toch ff moeten uittesten.
Normaal gezien is iedere class die -al is het er maar 1- abstracte functies bevat een abstracte class, en zou je de constructor er dus niet mogen kunnen van aanroepen, en zou je al een compiler error krijgen.
Bv in dit code-voorbeeld (dit is wel C#, aangezien ik hier Delphi niet installed heb):
[code]
Dit compileert niet, en dan krijg je volgende error:
Indien dat mocht lukken in Delphi, dan zou ik dat toch echt een slecht punt vinden voor Delphi.
Van zodra er een abstracte functie in een class zit, is die class imho abstract en mag je er geen objecten van kunnen instantieren.
Tja, het had inderdaad netter geweest als dat niet gedaan werd, maar de code completion kijkt niet naar andere units en heeft dus geen manier om het te achterhalen. Bovendien is de code die Delphi genereerd voor een thread wel correct en zou de ontwetende programmeur zelf de incorrecte inherited toe moeten voegen.Misschien een foutje in Delphi 5, dat als je een abstracte functie overrided, het keyword inherited ook automatisch in die functie body komt....
We adore chaos because we like to restore order - M.C. Escher