2017-06-22 2 views

Répondre

7

Le langage Delphi n'a pas vraiment de concept formel de classe abstraite.

Il est vrai que vous pouvez définir une classe pour être abstraite:

type 
    TMyClass = class abstract 
    end; 

Mais vous pouvez parfaitement instancier cette classe. En fait class abstract dans Delphi est une fonctionnalité utilisée uniquement par le compilateur Delphi .net abandonné depuis longtemps.

Une définition plus utile d'une classe abstraite est celle qui contient les méthodes abstract. Si vous essayez d'instancier une telle classe, un avertissement de compilateur sera émis. Ces avertissements peuvent être promus à des erreurs au moyen d'une option de compilateur, si vous le souhaitez. Lorsque la documentation mentionne TStream comme étant abstraite, cela signifie en fait qu'elle est "conceptuellement" abstraite. En fait, il n'a même pas abstract méthodes, donc par ma définition ci-dessus ce n'est pas abstrait.

Je ne sais pas vraiment pourquoi TStream ne contient pas de méthodes abstraites. Je suggère que le GetSize, SetSize, Read, Write et Seek devrait vraiment être déclaré abstract. Je soupçonne que si la classe était conçue aujourd'hui, ils seraient déclarés abstract et probablement ils ne sont pas pour des raisons historiques. L'instanciation TStream est une erreur très courante commise par des programmeurs moins expérimentés dans le Delphi RTL. Une fois que l'erreur a été commise plusieurs fois, la leçon est généralement apprise. Malheureusement, le système ne permet pas facilement de signaler cette erreur. Chaque nouveau programmeur doit apprendre à la dure.

+0

Je pense qu'ils ne changeront pas certaines méthodes pour abstrait parce qu'il pourrait y avoir des problèmes avec certains projets (peut-être grands et/ou anciens) qui les utilisent réellement –

+0

@AlbertoMiola * Je soupçonne que si la classe était conçue aujourd'hui, ils être déclaré 'abstract' et probablement ils ne sont pas pour des raisons historiques. * –

+0

@DavidHeffernan Si TStream est abstraitement conceptuellement, l'instance est aussi une erreur conceptuelle. Si je l'oublie et que j'utilise TStream et ses méthodes directement (pas les méthodes TMemoryStream), le code fonctionne bien. Ou pas? – user3083618