web-dev-qa-db-fra.com

Comment la classe abstraite est-elle différente de la classe concrète?

Je comprends POURQUOI nous avons besoin de la classe abstraite en Java - pour créer des sous-classes. Mais la même chose peut être réalisée en classe concrète. par exemple. La classe Enfant étend le parent. Ici, Parent peut très bien être abstrait et concret. Alors pourquoi avons-nous résumé ?? 

22
Ashish K Agarwal

Les classes abstraites ne peuvent pas être instanciées directement. Déclarer une classe comme abstraite signifie que vous ne voulez pas qu'elle soit instanciée et que la classe ne peut qu'être héritée. Vous imposez une règle dans votre code.

Si vous développez davantage votre exemple de relation parent/enfant en incluant une classe Personne, il serait donc logique que Personne soit abstrait. Le parent est une idée concrète et l'enfant aussi. Person est un concept abstrait en réalité et en code.

Un des avantages est que vous explicitement définissez et protégez l’idée de la classe abstraite. Lorsque vous déclarez une classe en tant qu'abstrait, il est impossible que vous, ou toute autre personne utilisant votre code, l'utilisiez de manière incorrecte en l'instanciant. Ce raisonnement est similaire à celui pour lequel nous spécifions des fonctions et des champs comme publics, privés ou protégés. Si vous déclarez une fonction ou un membre comme privé, vous la protégez effectivement contre un accès inapproprié au code client. Les Privates sont censés être utilisés au sein de la classe et c'est tout. Les classes abstraites sont destinées à être héritées et c'est tout.

Maintenant, devez-vous utiliser des classes abstraites et définir des fonctions et des champs comme privés plutôt que publics? Non, vous n'avez pas . Mais ces concepts sont fournis pour aider à garder le code propre et bien organisé. La classe abstraite est implémentée dans tous les langages orientés objet à ma connaissance. Si vous regardez autour de vous, vous verrez que C++, C #, VB.NET, etc. utilisent tous ce concept.

Un meilleur exemple spécifique:

Shape hierarchy UML Diagram

Dans l'exemple ci-dessus, la classe Shape doit être abstraite car elle n'est pas utile en soi. 

50
Paul Sasik

La classe abstraite signifie qu'il est abstrait non complet. Il a besoin d'une autre classe pour le compléter et/ou ses fonctionnalités. Vous devez étendre la classe abstraite. Cela sera utile avec certaines classes, par exemple. Fruit Tous les fruits ont la même propriété que la couleur. Mais vous pouvez avoir différentes propriétés pour différents fruits, par exemple si elles sont pulpeuses telles que l’orange ou non, par exemple la banane, etc.

6
Nitin Chhajer

Je sais que c’est une vieille question, mais il semble que l’affiche posait encore quelques questions sur les avantages de l’utilisation d’une classe abstraite.

Si vous êtes le seul à utiliser votre code, il n'y a aucun avantage. Cependant, si vous écrivez du code pour que d'autres l'utilisent, il y a un avantage. Supposons par exemple que vous ayez écrit une structure de mise en cache mais que vous souhaitiez permettre aux clients de créer leurs propres classes d'implémentation de mise en cache. Vous souhaitez également garder une trace de certaines métriques, telles que le nombre de caches ouverts, par hypothèse. Votre classe abstraite pourrait ressembler à quelque chose comme ceci:

public abstract class AbstractCache {
    public final void open() {
        ... // Do something here to log your metrics
        openImpl();
    }

    protected abstract void openImpl() { }
}

En soi, la classe AbstractCache est inutile et vous ne voulez pas que les clients essayent d’en instancier une et l’utilisent comme cache, ce qu’ils pourraient faire si la classe était concrète. Vous voulez également vous assurer qu'ils ne peuvent pas contourner votre enregistrement de métrique, ce qu'ils pourraient faire si vous leur fournissiez simplement une interface de cache.

4
Mike B

Une classe abstraite est censée être utilisée comme classe de base à partir de laquelle les autres classes sont dérivées. La classe dérivée est censée fournir des implémentations pour les méthodes qui ne sont pas implémentées dans la classe de base. Une classe dérivée qui implémente toutes les fonctionnalités manquantes est appelée une classe concrète

3
Hardik Chudasama

Le point d'abstraction n'est pas de créer des sous-classes. Il s'agit plus de créer des coutures dans votre code. Vous voulez que le code soit testable et découplé, ce qui mène au but ultime de la maintenabilité. Pour des raisons similaires, l'abstraction nous permet également de remplacer un peu de code sans provoquer d'effets secondaires. 

3
P.Brian.Mackey

Selon ma compréhension 

Abstract Classest une classe qui décrit simplement le comportement mais ne l’implémente pas . Considérons cet exemple Java pour Abstract Class:

public interface DoSomething(){
public void turnOnTheLight(); 
}

Les classes de bétonsont celles qui doivent être implémentées . Par exemple:

    public abstract class A(){
        public void doIt(); 
    } 
    public class B extends A(){
        public void doIt(){ 
        //concrete method
        System.out.println(“I am a Concrete Class Test”); 
    }
 }

En d'autres termes, une classe concrète en Java est une classe de ce type qui implémente tous les membres hérités de la classe interface ou abstraite.

0
Devanshi