Voici un scénario dans mon esprit et je l'ai googlé, Binged beaucoup mais a obtenu la réponse comme
"La classe abstraite n’a pas mis en oeuvre de méthode, nous ne pouvons pas créer l’objet" "Le mot 'Résumé' demande au compilateur de ne pas créer un objet de la classe"
Mais dans une classe simple où nous avons toutes les méthodes virtuelles, capable de créer un objet ???
En outre, nous pouvons définir différents accès modifiés au constructeur de la classe Abstract tels que privé, protégé ou public.
Ma recherche s'est terminée à cette question:
Pourquoi ne pouvons-nous pas créer un objet d'une classe abstraite?
Un type abstract est défini essentiellement comme ne pouvant pas être créé. Vous pouvez en créer sous-types, mais pas de ce type lui-même. La CLI ne vous laissera pas faire cela.
Une classe abstract
a un constructeur protected
(par défaut) permettant aux types dérivés de l'initialiser.
Par exemple, le type de base Stream
est abstrait. Sans un type dérivé où iraient les données ? Que serait arrive-t-il lorsque vous appelez une méthode abstract
? Il n'y aurait aucune implémentation réelle de la méthode à invoquer.
Parce que c'est abstrait et qu'un objet est concret. Une classe abstraite est un peu comme un modèle, ou une structure vide/partiellement vide, vous devez l’étendre et la construire avant de pouvoir l’utiliser.
Prenons par exemple une classe abstraite "Animal". Il n’existe pas d’animal «pur» - il existe des types d’animaux spécifiques. Vous pouvez donc instancier Chien, Chat et Tortue, mais vous ne devriez pas pouvoir instancier Animal simple, ce n’est qu’un modèle de base. Et il existe certaines fonctionnalités communes à tous les animaux, telles que "makeSound()",
mais qui ne peuvent pas être définies au niveau animal de base. Donc, si vous pouviez créer un objet Animal et que vous appelleriez makeSound(),
, comment cet objet saurait-il quel son produire?
Il est destiné à être utilisé comme classe de base.
http://msdn.Microsoft.com/en-us/library/sf985hc5(VS.71).aspx
Le modificateur abstrait peut être utilisé avec classes, méthodes, propriétés, indexeurs et événements.
Utilisez le modificateur abstrait dans une classe déclaration indiquant qu'une classe est uniquement destiné à être une classe de base de d'autres classes.
Les classes abstraites ont les suivantes fonctionnalités:
- Une classe abstraite ne peut pas être instanciée.
- Une classe abstraite peut contenir des méthodes abstraites et des accesseurs.
- Il n'est pas possible de modifier une classe abstraite avec le modificateur scellé, ce qui signifie que la classe ne peut pas être héritée.
- Une classe non abstraite dérivée d'une classe abstraite doit inclure les implémentations effectives de toutes les méthodes abstraites héritées et des accesseurs.
En plus des autres réponses, vous ne pourrez peut-être pas créer une instance de la classe abstraite, mais vous pourrez certainement faire référence à des occurrences de types dérivés via le type abstrait et utiliser des méthodes ou des propriétés définies dans la base abstraite.
abstract class A
{
public abstract void D();
public void E() { }
}
class B : A
{
public override void D() { }
}
class C : A
{
public override void D() { }
}
...
A a = new B();
a.D();
a.E();
List<A> list = new List<A>() { new B(), new C() };
En termes simples, une classe abstraite est comme un shell d'une classe. Toutes les méthodes n'ont pas d'implémentations, quelque chose comme un circuit avec quelques segments de fil manquants. Bien que la majorité de celle-ci puisse être construite, il appartient aux utilisateurs de coller les fils et les résistances dans ces segments comme bon leur semble.
En ce qui concerne les raisons pour lesquelles Java ne vous laissera pas le créer, une partie de celui-ci est simplement une sécurité intrinsèque (de nombreuses classes abstraites fonctionneront parfaitement sans ajouts, à condition de ne pas appeler des méthodes non implémentées).
Les classes abstraites doivent avoir au moins une méthode virtuelle ou une propriété sans implémentation. Ceci est marqué avec le mot-clé abstrait. Les classes héritières doivent fournir une implémentation si elles ne sont pas abstraites elles-mêmes. Vous ne pouvez pas créer une instance d'une classe abstraite car sa mise en œuvre n'est pas complète. Si tel est le cas, il ne devrait pas être marqué abstrait en premier lieu.
Si nous avons une classe contenant une fonction virtuelle pure, la classe est abstraite. Si nous créons un objet de la classe abstraite et appelons la méthode sans corps (car la méthode est virtuelle), cela produira une erreur. C'est pourquoi nous ne pouvons pas créer d'objet de classe abstraite.
La référence studytonight :
Lorsque nous créons une fonction virtuelle pure dans la classe Abstract, nous réservons un emplacement pour une fonction dans le VTABLE (étudié dans le dernier sujet), mais pas mettre n'importe quelle adresse dans cette case. Par conséquent, le VTABLE sera incomplet.
Comme la classe VTABLE for Abstract est incomplète, d’où le compilateur ne laissera pas la création d'objet pour une telle classe et affichera un message d'erreur chaque fois que vous essayez de le faire.
Lorsque nous créons une fonction virtuelle pure dans la classe Abstract, nous réservons un emplacement pour une fonction dans le VTABLE (étudié dans le dernier sujet), mais nous ne mettons aucune adresse dans cet emplacement. Par conséquent, le VTABLE sera incomplet.
Comme la classe VTABLE for Abstract est incomplète, le compilateur n'autorisera pas la création d'objet pour cette classe et affichera un message d'erreur chaque fois que vous tenterez de le faire.
Source: Study Tonight
Nous ne pouvons pas créer d’objet pour la classe abstraite bcoz. La plupart des classes abstraites contiennent des "méthodes abstraites". Les méthodes abstraites sont donc des méthodes incomplètes. ne peut pas créer d'objet pour la classe abstraite.
Voici une question similaire à StackOverflow. En bref, il est légal d'avoir un constructeur public sur une classe abstraite. Certains outils vous avertiront que cela n’a aucun sens.
Quelle est l'utilité des constructeurs publics dans les classes abstraites en C #?
En fait, lorsque nous créons un objet d’une classe normale, nous utilisons Constructor pour allouer la mémoire À cet objet, comme
myclass obj=new myclass();
Ici, l'utilisation de constructorr clr identifie la quantité de mémoire dont l'objet a besoin en fonction de l'instance variable et des méthodes. Mais dans le cas de classes abstraites, nous ne pouvons pas prédire la quantité de mémoire requise car nous n'implémentons pas les méthodes abstraites, il est donc impossible de créer un objet.