Quelle est la différence entre une simple classe de base et classe abstraite?
Je faisais une sorte de R&D et je suis confondre avec la notion de classe abstraite.
Ce que je sais à propos d'une classe abstraite, c'est qu'il peut contenir des méthodes concrètes, et il peut contenir des méthodes virtuelles. Il peut ou peut ne pas contenir une méthode abstraite, et il peut contenir des champs et à la restriction de la création directe d'instances.
Mais nous pouvons réaliser tout cela dans une simple classe de base (ajout de méthodes virtuelles fera beaucoup parce que d'une classe de base avec des méthodes virtuelles qui ne contient pas une mise en œuvre il y et de remplacement est identique à la méthode abstraite). Alors pourquoi avons-nous besoin d'une classe abstraite si l'interface en charge l'héritage multiple et des événements?
OriginalL'auteur peter | 2013-09-19
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas. Vous ne pouvez pas avoir un non-classe abstraite qui a résumé les méthodes (les méthodes d'où la signature est définie, mais pas de la mise en œuvre est donné, ainsi forcer les classes dérivées pour fournir une implémentation).
Les classes abstraites existent de sorte qu'ils peuvent fournir une combinaison de la mise en œuvre des méthodes et des méthodes abstraites.
Vous pouvez essayer d'éviter d'utiliser
abstract
classes en utilisant des implémentations concrètes qu'il suffit de ne pas faire quelque chose, mais il a un certain nombre d'inconvénients:Également envisager de non-nulle méthodes dans un monde sans abstrait. Ils auraient besoin de jeter (c'est à dire
NotImplementedException
) ou de retourner une valeur non valide (c'est à direnull
). Cela pourrait être tout à fait bien pire qu'une méthode qui ne vient de rien.Vous ne pouvez pas l'oublier. Ils sont la clé unique différence. Si vous oubliez, il vous laisse avec rien, mais vous pas les oublier, parce qu'ils sont les point d'une classe abstraite. Si vous ne pas ont toutes les méthodes abstraites, alors vous n'avez pas besoin d'une classe abstraite.
de ce que j'étais destiné est des méthodes virtuelles aussi, nous pouvons mettre que des méthodes abstraites qui n'est pas toute la mise en œuvre et de la remplacer
Qui n'a pas la force de l'appelant pour remplacer la mise en œuvre, et donne l'impression que le type et les méthodes, en particulier, sont de travail, alors qu'en fait ils ne le sont pas. En ajoutant la fonction de résumé des méthodes et des types d'empêcher l'utilisation non conforme d'un type incomplète par quelqu'un qui ne sait pas qu'il est incomplet. Il fournit également un contrat clair pour les sous-classes à ce que la fonctionnalité dont ils ont besoin pour fournir des. En particulier, considèrent que la non-nulle méthodes, dans lequel la base de la mise en œuvre dans un monde sans
abstract
aurait besoin de jeter ou de retourner une valeur non valide.c'est excellent commentaire, pouvez-vous modifier votre réponse à ce commentaire
OriginalL'auteur Servy
La principale différence est que le compilateur ne vous laisseront pas de les instancier une classe abstraite, alors que vous pourriez instancier une classe de base (qui ne peut faire sens).
Avis avec la variable
d
nous sommes assurés que les méthodes abstraites ont été remplacés (sinon, leDerivedType
classe serait une erreur de compilateur).Puisque vous commentez beaucoup de confusion encore, je vais vous donner l'exemple je l'avais vraiment fait de ce concept, cliquez sur pour moi. Imaginez-vous faire un tour de jeu de défense. Vous avez un tour de classe, et chaque tour a la capacité d'attaque, afin de vous faire un résumé de la tour de la classe comme ceci:
Maintenant, je peux faire plusieurs tour de classes:
Maintenant, si vous voulez déclarer une liste de tours, vous pouvez écrire:
alors parcourir et de les rendre tous à l'attaque:
Et chaque classe est la garantie d'avoir mis en œuvre l'attaque, car elle a été marquée abstrait et ce serait une erreur de compilation si ils n'ont pas. Maintenant, tout ce qui pourrait être fait avec une classe de base, à l'exception d'une classe de base permettrait à ceci:
Maintenant, quand il essaie de l'appeler attaque sur que
new Tower()
il va frapper un vide méthode abstraite, qui n'est pas ce que nous voulons. Donc, pour interdire à déclarer que quelque chose comme un générique de la tour, nous faisons de la classe abstraite, alors nous savons que tout aura sa propre définition deAttack
et il va faire quelque chose.mais alors vous avez un dérivé de la classe au lieu d'une classe abstraite (de sorte que vous êtes assuré les méthodes abstraites ont une définition)
J'ai édité un exemple dans mon code
Grand exemple de code. C'est similaire à ce que j'ai discuté avec des animaux ci-dessus. Par exemple, si
abstract class Animal
a la fonctionpublic abstract void eatStuff()
, c'est la garantie que chaque béton instance deAnimal
sait comment faire sa propre alimentation.Ouais j'ai toujours détesté l'animal exemple parce que c'est dur pour moi de visualiser l'écriture de code pour un animal, je tiens à donner des exemples relatifs à la fabrication des jeux, parce que tout le monde aime faire des jeux!
OriginalL'auteur Kevin DiTraglia
Il y a certaines classes qui n'existent tout simplement pas dans le monde réel, et devrait donc théoriquement être marqué comme
abstract
. Par exemple, considéronsabstract class Animal
. Il n'y a pas une telle chose comme un "animal" dans le monde réel. Au lieu de cela, il y a des types de béton d'animaux tels queDog
,Cat
, etc.mais bon point pour me le rappeler 🙂
OriginalL'auteur musical_coder
Une réponse simple pourrait être:-
Classes de Base ont leurs propres implémentations des méthodes, ces implémentations peuvent être utilisés/ajouté dans une classe héritée. Vous pouvez instancier une classe de base
Les classes abstraites avoir de déclarations pour les méthodes de classe. Toute classe héritant de la classe abstraite doit mettre en œuvre c'est résumé méthodes, ou le devient à l'abstrait lui-même. Vous ne pouvez pas instancier une classe abstraite
Exemple:-
de classe B peut toujours utiliser Method1 de la classe A, parce que c'est héréditaire. Et si Une classe est abstraite, toutes les méthodes doivent être déclarés comme Method2 et devraient être mis en œuvre dans la classe B, de sorte qu'il peut être utilisé.
C'était juste un exemple. Même si je comprends ce que vous pointez 😉
OriginalL'auteur Rahul Tripathi