L'endroit le plus couramment utilisé est d'implémenter la méthode modèle (Template Method) ? Par exemple, vous souhaitez écrire un lot de proxys locaux pour les services distants. Pour ce lot d'agents, les étapes d'obtention de l'adresse de la demande, d'envoi de la demande et d'obtention du contenu correspondant sont toutes communes. Seules les deux étapes de définition du type de codage de caractères et de définition du rappel de réponse sont différentes.
À ce stade, vous pouvez définir une classe abstraite et terminer le processus de demande. Les différences sont laissées à la définition des sous-classes réelles. Ce n'est pas que le concepteur [ne permet pas] à la classe abstraite d'être instanciée, mais que certains attributs ne peuvent pas être déterminés avant de connaître les caractéristiques du service distant, rendant l'instanciation impossible.
L'exemple dans JDK est java.io.InputStream. Sa méthode read(byte[], int, int) appelle la méthode java.io.InputStream.read(). Read() est une méthode abstraite et doit être définie dans une sous-classe. Vous pouvez apprendre du code source.
public abstract int read() throws IOException;
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
Ce n'est pas que les classes abstraites sans méthodes abstraites ont une signification particulière. C'est juste la signification ordinaire des classes abstraites, étant donné une implémentation par défaut, cela peut nécessiter moins de code que l'implémentation directe de l'interface. D’un autre côté, quel est l’intérêt d’exiger qu’une classe abstraite conserve une ou deux méthodes abstraites ?
Au contraire, afin que les sous-classes de cette classe créent certaines méthodes . Bien sûr, c'est aussi une exigence de l'interface, mais l'interface exige que toutes les méthodes soient des méthodes abstraites. Mais les classes abstraites peuvent prédéfinir certaines méthodes qui n'ont pas besoin d'être remplacées par des sous-classes.
Les classes abstraites et les interfaces sont toutes destinées à l'abstraction. Je ne parlerai pas des avantages de l'abstraction. Par exemple, si nous voulons implémenter une interface ou une classe Equal, nous définissons deux méthodes equal et unequal. Si elle est implémentée à l’aide d’une interface, une classe doit implémenter ces deux méthodes. Cependant, s'il est implémenté avec une classe abstraite, unequal peut être implémenté comme !equal dans la classe abstraite, de sorte que unequal doit être implémenté dans sa sous-classe.
Personnellement, je préfère les classes abstraites (mais Java ne prend pas en charge l'héritage multiple). Par exemple, l'interface Compareable a en fait une exigence, si a<b && b < c alors a < c, il n'y a aucune garantie dans l'interface que cela soit correct. Bien sûr, les classes abstraites ne peuvent pas résoudre le problème, mais pour ce qui précède Equal, l'implémentation de classes abstraites est plus conforme aux exigences supplémentaires.
Session de réponse aux demandes d'attributs globaux communs Méthode commune getLoginUser() Bien sûr, il y en aura d'autres (quelques attributs et méthodes communs). Comme il existe un contrôleur, le service dao peut également être utilisé. J'extrais généralement du code de réinitialisation dans la classe parent pour l'utiliser.
L'endroit le plus couramment utilisé est d'implémenter la méthode modèle (Template Method) ?
Par exemple, vous souhaitez écrire un lot de proxys locaux pour les services distants. Pour ce lot d'agents, les étapes d'obtention de l'adresse de la demande, d'envoi de la demande et d'obtention du contenu correspondant sont toutes communes. Seules les deux étapes de définition du type de codage de caractères et de définition du rappel de réponse sont différentes.
À ce stade, vous pouvez définir une classe abstraite et terminer le processus de demande. Les différences sont laissées à la définition des sous-classes réelles. Ce n'est pas que le concepteur [ne permet pas] à la classe abstraite d'être instanciée, mais que certains attributs ne peuvent pas être déterminés avant de connaître les caractéristiques du service distant, rendant l'instanciation impossible.
L'exemple dans JDK est java.io.InputStream. Sa méthode read(byte[], int, int) appelle la méthode java.io.InputStream.read(). Read() est une méthode abstraite et doit être définie dans une sous-classe. Vous pouvez apprendre du code source.
Vous devez voir s'il hérite de classes ou implémente des interfaces
Très probablement, certaines méthodes partagées sont placées
Sinon, pourquoi ne pas le changer en interface
Certaines méthodes publiques et champs d'instance peuvent avoir été extraits.
Ce n'est pas que les classes abstraites sans méthodes abstraites ont une signification particulière. C'est juste la signification ordinaire des classes abstraites, étant donné une implémentation par défaut, cela peut nécessiter moins de code que l'implémentation directe de l'interface. D’un autre côté, quel est l’intérêt d’exiger qu’une classe abstraite conserve une ou deux méthodes abstraites ?
Au contraire, afin que les sous-classes de cette classe créent certaines méthodes . Bien sûr, c'est aussi une exigence de l'interface, mais l'interface exige que toutes les méthodes soient des méthodes abstraites. Mais les classes abstraites peuvent prédéfinir certaines méthodes qui n'ont pas besoin d'être remplacées par des sous-classes.
Les classes abstraites et les interfaces sont toutes destinées à l'abstraction. Je ne parlerai pas des avantages de l'abstraction. Par exemple, si nous voulons implémenter une interface ou une classe
Equal
, nous définissons deux méthodesequal
etunequal
. Si elle est implémentée à l’aide d’une interface, une classe doit implémenter ces deux méthodes. Cependant, s'il est implémenté avec une classe abstraite,unequal
peut être implémenté comme!equal
dans la classe abstraite, de sorte queunequal
doit être implémenté dans sa sous-classe.Personnellement, je préfère les classes abstraites (mais
Java
ne prend pas en charge l'héritage multiple). Par exemple, l'interfaceCompareable
a en fait une exigence, sia<b && b < c
alorsa < c
, il n'y a aucune garantie dans l'interface que cela soit correct. Bien sûr, les classes abstraites ne peuvent pas résoudre le problème, mais pour ce qui précèdeEqual
, l'implémentation de classes abstraites est plus conforme aux exigences supplémentaires.Exemple :
Basé sur : spring mvc
Session de réponse aux demandes d'attributs globaux communs
Méthode commune getLoginUser()
Bien sûr, il y en aura d'autres (quelques attributs et méthodes communs).
Comme il existe un contrôleur, le service dao peut également être utilisé.
J'extrais généralement du code de réinitialisation dans la classe parent pour l'utiliser.