recherche

Maison  >  Questions et réponses  >  le corps du texte

java中没有抽象方法的抽象类有什么意义?仅仅是为了让别人不能创建该类的对象?

怪我咯怪我咯2804 Il y a quelques jours761

répondre à tous(6)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:47:59

    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;
    }
    

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:47:59

    • 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

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:47:59

    Certaines méthodes publiques et champs d'instance peuvent avoir été extraits.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:47:59

    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 ?

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:47:59

    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.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:47:59

    Exemple :
    Basé sur : spring mvc

    public abstract class BaseController {
        protected HttpServletRequest request;
        protected HttpServletResponse response;
        protected HttpSession session;
    
        @ModelAttribute
        public void setReqAndResp(HttpServletRequest request, HttpServletResponse response){
            this.request = request;
            this.response = response;
            this.session = request.getSession();
        }
        protected Map<String,String> getLoginUser(){
            Object loginUser = request.getAttribute(Config.LOGIN_USER);
            Map<String,String> loginUserMap = new HashMap<>();
            loginUserMap.put(Config.USER_CODE,loginUser==null?"":loginUser.toString());
            return loginUserMap;
                //return (User) session.getAttribute(Constants.LOGIN_USER);
        }
    }
    

    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.

    répondre
    0
  • Annulerrépondre