Κοινή χρήση τεχνολογίας

[Εισαγωγή στην JAVA] Ημέρα 15 - Διεπαφή

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

[Εισαγωγή στην JAVA] Ημέρα 15 - Διεπαφή



Γιατί υπάρχει διεπαφή;
Όπως όλοι γνωρίζουμε, η κληρονομικότητα είναι η εξαγωγή των κοινών αφαιρέσεων στην υποκλάση στη μητρική κλάση και η απόκτησηκοινότητα ολόκληρου του συστήματοςΓια να αποθηκεύσετε τον κώδικα, ωστόσο, υπάρχει επίσης μια κατάσταση: οι περισσότερες υποκλάσεις έχουν μια ορισμένη κοινότητα, αλλά μόνο μερικές υποκλάσεις δεν έχουν αυτό το χαρακτηριστικό, τότε εάν αυτή η κοινότητα γραφτεί στη γονική κλάση, θα κληρονομηθεί , κάτι που είναι παράλογο για αυτές τις λίγες υποκατηγορίες.
Για παράδειγμα: οι γάτες και οι σκύλοι μπορούν να κολυμπήσουν, αλλά τα κουνέλια δεν μπορούν αυτήν τη στιγμή, εάν η μέθοδος "κολύμβησης" ορίζεται στη γονική τάξη, δεν είναι λογικό να κληρονομήσει το κουνέλι αντίστοιχα, μπορεί να συμβεί Η μορφή γραφής και η ονομασία των δύο μεθόδων είναι ασυνεπής. Επομένως, πρέπει να ορίσουμε μια νέα έννοια για να περιορίσουμε τις προδιαγραφές γραφής των μεθόδων «κολύμβησης» σε αυτές τις δύο υποκατηγορίες.Σε αυτό το σημείο, μπορούμε να ορίσουμε ένα "κολύμπι"διεπαφή, ορίστε την αφηρημένη μέθοδο swim() στη διεπαφή και, στη συνέχεια, αφήστε τις γάτες και τους σκύλους να συνδεθούν σε αυτήν τη διεπαφή για να διασφαλίσετεΕνοποίηση κώδικα
Συνοψίζοντας, η διεπαφή είναι ακανόνας, όταν πρέπει να ορίσουμε κανόνες για πολλές κλάσεις ταυτόχρονα, πρέπει να χρησιμοποιήσουμεδιεπαφή

1. Η διεπαφή είναι μια αφαίρεση της «συμπεριφοράς»

Η διεπαφή δεν αντιπροσωπεύει ένα είδος πράγματος, η διεπαφή αντιπροσωπεύειένας κανόνας, έτσι οι διεπαφές μπορούν να μεταβιβαστούν ως παράμετροι σε μεθόδους.
«Είτε πρόκειται για φορτηγό, είτε για τρίτροχο, είτε για ανθρώπινο δυναμικό, εφόσον μπορεί να κινηθεί, θα είναι χρήσιμο».

搬家(车的对象);
  • 1
搬家(搬家公司);
  • 1
public interface 运输 {
	...
}
  • 1
  • 2
  • 3
public void 搬家(运输的接口 c) {
	...
}
  • 1
  • 2
  • 3

2. Ορισμός και χρήση διεπαφών

  • Οι διεπαφές ορίζονται με τη διεπαφή λέξεων-κλειδιών.
public interface 接口名 {}
  • 1
  • Οι διεπαφές δεν μπορούν να δημιουργηθούν, πράγμα που σημαίνει ότι οι διεπαφές δεν μπορούν να χρησιμοποιηθούν για τη δημιουργία αντικειμένων.
  • Η διαφορά μεταξύ διεπαφής και κλάσης είναιολοκληρώσειΟι σχέσεις αντιπροσωπεύονται από τη λέξη-κλειδί υλοποιεί.
public class 类名 implements 接口名 {}
  • 1
  • Μια υποκλάση μιας διεπαφής (κλάση υλοποίησης) είτε παρακάμπτει όλες τις αφηρημένες μεθόδους στη διεπαφή είτε είναι η ίδια μια αφηρημένη κλάση.
  • Η σχέση υλοποίησης μεταξύ διεπαφών και κλάσεων μπορεί να είναιΕνιαία υλοποίηση, μπορεί επίσηςΠολλαπλές υλοποιήσεις
public class 类名 implements 接口名1 , 接口名2 {}
  • 1
  • Μια κλάση υλοποίησης μπορεί να υλοποιήσει πολλαπλές διεπαφές ενώ κληρονομεί μια κλάση.
public class 类名 extends 父类 implements 接口名1 , 接口名2 {}
  • 1

πρακτική: Γράψτε τυπικές τάξεις Javabean με διεπαφές και αφηρημένες κλάσεις.

 青蛙		属性:名字,年龄		行为:吃虫子,蛙泳
 狗			属性:名字,年龄		行为:吃骨头,狗刨
 兔子		属性:名字,年龄		行为:吃胡萝卜
  • 1
  • 2
  • 3

Γράψτε πρώτα τη μητρική κλάση Επειδή οι τρεις υποκλάσεις τρώνε διαφορετικά πράγματα, μπορείτε να ορίσετε την eat() ως μια αφηρημένη μέθοδο:

package oopInterface;

public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Εγγραφή διεπαφής Swim:

package oopInterface;

public interface Swim {
    public abstract void swim();
}
  • 1
  • 2
  • 3
  • 4
  • 5

Όταν γράφετε μια τάξη βατράχου, προσέξτε να κληρονομήσετε τη γονική τάξη και να ξαναγράψετε την αφηρημένη μέθοδο της γονικής τάξης και δώστε προσοχή στην εφαρμογή της διεπαφής κολύμβησης:

package oopInterface;

public class Frog extends Animal implements Swim {
    public Frog() {
        super();
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void swim() {
        System.out.println("青蛙在蛙泳。");
    }

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Όταν γράφετε μια τάξη σκύλων, προσέξτε να κληρονομήσετε τη γονική τάξη και να ξαναγράψετε την αφηρημένη μέθοδο της τάξης γονέα για να εφαρμόσετε τη διεπαφή κολύμβησης:

package oopInterface;

public class Dog extends Animal implements Swim {

    public Dog(){
        super();
    }

    public Dog(String name, int age) {
        super(name,age);
    }
    @Override
    public void swim() {
        System.out.println("狗在狗刨。");
    }

    @Override
    public void eat() {
        System.out.println("狗在吃骨头。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Όταν γράφετε μια τάξη rabbit, σημειώστε ότι χρειάζεται μόνο να κληρονομήσετε τη γονική κλάση και να παρακάμψετε την αφηρημένη μέθοδο και δεν χρειάζεται να εφαρμόσετε τη διεπαφή κολύμβησης (δεν μπορείτε να κολυμπήσετε):

package oopInterface;

public class Rabbit extends Animal {

    public Rabbit() {
    }

    public Rabbit(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("兔子在吃胡萝卜。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Γράψτε δοκιμαστικές τάξεις.

package oopInterface;

public class Test {
    public static void main(String[] args) {
        Frog f = new Frog("小绿",23);
        f.eat();
        f.swim();
        System.out.println(f.getName() + ", " + f.getAge());
        Dog d = new Dog("大D", 24);
        d.eat();
        d.swim();
        System.out.println(d.getName() + ", " + d.getAge());
        Rabbit r = new Rabbit("兔子", 30);
        r.eat();
        System.out.println(r.getName() + ", " + r.getAge());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Χαρακτηριστικά των μελών στη διεπαφή

  • Μεταβλητές μέλους: Οι μεταβλητές μέλους στη διεπαφή μπορούν να είναι μόνοσυνεχής, το δημόσιο στατικό τελικό χρησιμοποιείται από προεπιλογή (ακόμα κι αν δεν το γράψετε, θα ληφθεί αυτόματα υπόψη με αυτόν τον τρόπο).
  • Κατασκευαστής: διεπαφήΟχιΜέθοδος κατασκευής.
  • Μέθοδοι μελών: Πριν από το JDK7, θα μπορούσαν να είναι μόνο αφηρημένες μέθοδοι.ΠροκαθορισμένοΟ τροποποιητής είναι δημόσιος περίληψη μετά το JDK8, οι μέθοδοι με σώματα μεθόδων μπορούν να οριστούν σε διεπαφές μετά το JDK9, οι ιδιωτικές μέθοδοι μπορούν να οριστούν σε διεπαφές.

4. Η σχέση μεταξύ διεπαφών και κλάσεων

  • Η σχέση μεταξύ των κλάσεων: Σχέση κληρονομικότητας - είναι δυνατή μόνο μονή κληρονομικότητα, όχι πολλαπλή κληρονομικότητα, αλλά κληρονομικότητα πολλαπλών επιπέδων.
  • Η σχέση μεταξύ κλάσεων και διεπαφών: Σχέση υλοποίησης - μπορεί να υλοποιηθεί μόνη της ή σε πολλαπλές υλοποιήσεις και μπορείτε επίσης να εφαρμόσετε πολλαπλές διεπαφές ενώ κληρονομείτε μια κλάση.
  • Η σχέση μεταξύ διεπαφών: σχέση κληρονομικότητας - μπορεί να είναι μεμονωμένη κληρονομικότητα ή πολλαπλή κληρονομικότητα.

Ειδοποίηση:
1. Όταν μια κλάση υλοποιεί μια διεπαφή, πρέπει είτε να εφαρμόσει όλες τις αφηρημένες μεθόδους στη διεπαφή, είτε η ίδια η κλάση είναι επίσης μια αφηρημένη κλάση.
2. Μια κλάση μπορεί να υλοποιήσει πολλαπλές διεπαφές, πρέπει να είναιόλαΌλες οι αφηρημένες μέθοδοι που θα εφαρμοστούν στη διεπαφή εφαρμόζονται.
3. Οι διεπαφές μπορούν να κληρονομηθούν από πολλαπλές διεπαφές.όλαΌλες οι αφηρημένες μέθοδοι εφαρμόζονται.

πρακτική: Γράψτε τυπικές τάξεις Javabean με διεπαφές και αφηρημένες κλάσεις.

乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
  • 1
  • 2
  • 3
  • 4
//Person类
package oopInterExp;

//因为直接创建顶层父类人的对象是没有意义的
//所以将其写为抽象类
public abstract class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
//Sporter类继承Person
package oopInterExp;

public abstract class Sporter extends Person {

    public Sporter(String name, int age) {
        super(name, age);
    }

    public Sporter() {
    }

    public abstract void learn();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
//Coach类继承Person
package oopInterExp;

public abstract class Coach extends Person {

    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
//SpeakEnglish接口
package oopInterExp;

public interface SpeakEnglishInter {
    public abstract void speakEnglish();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
//PingPongSporter继承Sporter,实现SpeakEnglish
package oopInterExp;

public class PingPongSporter extends Sporter implements SpeakEnglishInter {

    public PingPongSporter(String name, int age) {
        super(name, age);
    }

    public PingPongSporter() {
    }

    @Override
    public void learn() {
        System.out.println("学习乒乓球。");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球运动员在说英语。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
//PingPongCoach继承Coach,实现SpeakEnglish
package oopInterExp;

public class PingPongCoach extends Coach implements SpeakEnglishInter {
    public PingPongCoach() {
    }

    public PingPongCoach(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("教乒乓球。");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球教练在说英语。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
//BasketballSporter继承Sporter
package oopInterExp;

public class BasketballSporter extends Sporter {

    public BasketballSporter(String name, int age) {
        super(name, age);
    }

    public BasketballSporter() {
    }

    public void learn() {
        System.out.println("学篮球。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
//BasketballCoach继承Coach
package oopInterExp;

public class BasketballCoach extends Coach {

    public BasketballCoach() {
    }

    public BasketballCoach(String name, int age) {
        super(name, age);
    }

    public void teach() {
        System.out.println("教篮球。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

5. Νέες μέθοδοι στη διεπαφή

5.1 Νέες μέθοδοι στη διεπαφή έναρξης JDK8

Πριν από το JDK7, μόνο αφηρημένες μέθοδοι μπορούσαν να οριστούν σε διεπαφές.
Το νέο χαρακτηριστικό του JDK8 είναι: μέθοδοι με σώματα μεθόδων μπορούν να οριστούν στη διεπαφή (μπορεί να ορίσειΠροκαθορισμένομέθοδο ήστατικόςμέθοδος).
Το νέο χαρακτηριστικό του JDK9 είναι: μπορεί να οριστεί στη διεπαφήιδιωτικόςμέθοδος.

5.1.1 Προεπιλεγμένες μέθοδοι στις διεπαφές

Μέθοδοι με σώματα μεθόδων ορίζονται στη διεπαφή, κυρίως γιαΑναβάθμιση διεπαφήςΛαμβάνοντας υπόψη ότι η διεπαφή δεν μπορεί να είναι αμετάβλητη, πρέπει να προστεθούν νέες μέθοδοι για αναβάθμιση, εάν αυτές οι μέθοδοι είναι αφηρημένες μέθοδοι, αυτή τη στιγμή, αυτές οι μέθοδοι πρέπει να εφαρμοστούν ταυτόχρονα στην κλάση υλοποίησης, κάτι που είναι πολύ ενοχλητικό. Δεν είναι εύκολο να συγχρονιστεί εάν η αναβάθμιση χρησιμοποιεί μια μέθοδο με ένα σώμα μεθόδου, επομένως η κλάση υλοποίησης δεν χρειάζεται να τροποποιηθεί επιπλέον, εάν χρειάζεται τροποποίηση, μπορεί επίσης να τροποποιηθεί ξανά.

  • Για να ορίσετε προεπιλεγμένες μεθόδους στη διεπαφή, πρέπει να χρησιμοποιήσετε λέξεις-κλειδιά Προκαθορισμένο Περιποίηση.
  • Μορφή: δημόσια προεπιλεγμένη τιμή επιστροφής τύπος μεθόδου όνομα (λίστα παραμέτρων) { }
  • Παράδειγμα: δημόσια προεπιλογή void show() { }
  • Οι προεπιλεγμένες μέθοδοι δεν είναι αφηρημένες μέθοδοι και δεν χρειάζεται να παρακαμφθούν. Αν όμως ξαναγραφτεί, η προεπιλεγμένη λέξη-κλειδί πρέπει να αφαιρεθεί κατά την επανεγγραφή.
  • το δημόσιο μπορεί να παραλειφθεί, αλλά η προεπιλογή δεν μπορεί να παραλειφθεί.
  • Εάν υλοποιούνται πολλές διεπαφές και υπάρχουν προεπιλεγμένες μέθοδοι με το ίδιο όνομα σε πολλές διεπαφές, τότε η υποκλάση πρέπει να παρακάμψει τη μέθοδο (η μη παράκαμψη θα προκαλέσει διενέξεις).

Διεπαφή Inter1:

package oopInterface5;

public interface Inter1 {
    public abstract void method();
    public default void default_method() {
        System.out.println("Inter1接口中的默认方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Διεπαφή Inter2:

package oopInterface5;

public interface Inter2 {
    public default void default_method() {
        System.out.println("Inter2接口中的默认方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Οι δύο προεπιλεγμένες μέθοδοι έχουν το ίδιο όνομα Εάν η κλάση υλοποίησης υλοποιεί αυτές τις δύο διεπαφές ταυτόχρονα, αυτή η προεπιλεγμένη μέθοδος πρέπει να ξαναγραφτεί!

package oopInterface5;

public class InterImpl implements Inter1, Inter2 {

    @Override
    public void method() {
        System.out.println("抽象方法的实现");
    }

    @Override
    public void default_method() {
        System.out.println("重写接口中的默认方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Τάξη δοκιμής:

package oopInterface5;

public class Test {
    public static void main(String[] args) {
            InterImpl ii = new InterImpl();
            ii.method();				//抽象方法的实现
            ii.default_method();		//重写接口中的默认方法
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
5.1.2 Στατικές μέθοδοι σε διεπαφές

Το JDK8 και μεταγενέστερα θα επιτρέψει τον καθορισμό στατικών μεθόδων σε διεπαφές, οι οποίες πρέπει να τροποποιηθούν με στατικές.
στη διεπαφήστατική μέθοδοςΗ μορφή ορισμού είναι:

  • όνομα μεθόδου τύπου δημόσιας στατικής τιμής επιστροφής (λίστα παραμέτρων) { }
  • Παράδειγμα: public static void show() { }

Πράγματα που πρέπει να σημειώσετε σχετικά με τις στατικές μεθόδους στις διεπαφές:

  • Οι στατικές μέθοδοι μπορούν να περάσουν μόνοΌνομα διεπαφήςΚαλείται, δεν μπορεί να κληθεί μέσω του ονόματος της κλάσης υλοποίησης ή του ονόματος αντικειμένου.
  • το δημόσιο μπορεί να παραλειφθεί, το στατικό δεν μπορεί να παραλειφθεί.

Γράψτε μια διεπαφή:

package oopInterface6;

public interface Inter {
    public abstract void method();

    public static void static_method() {
        System.out.println("接口中的静态方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Γράψτε μια κλάση υλοποίησης Υπάρχει επίσης μια στατική μέθοδος στην κλάση με το ίδιο όνομα με τη μέθοδο στη διεπαφή, αλλά αυτή δεν είναι παράκαμψη επειδή οι στατικές μέθοδοι δεν μπορούν να παρακαμφθούν.

package oopInterface6;

public class InteImpl implements Inter {
    @Override
    public void method() {
        System.out.println("重写接口中的抽象方法");
    }

    //这不叫重写
    public static void static_method() {
        System.out.println("我不是重写的Inter接口中的静态方法");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Αλλά στην πραγματικότητα, οι δύο είναι διαφορετικές μέθοδοι.

package oopInterface6;

public class Test {
    public static void main(String[] args) {
        InteImpl ii = new InteImpl();
        ii.method();						  //重写接口中的抽象方法
        Inter.static_method();               //调用接口中的静态方法
        InteImpl.static_method();           //调用实现类中的一个同名的静态方法
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.2 Νέες μέθοδοι στη διεπαφή έναρξης JDK9

5.2.1 Ορισμός ιδιωτικών μεθόδων στη διεπαφή
  • Μορφή 1: όνομα μεθόδου τύπου ιδιωτικής τιμής επιστροφής (λίστα παραμέτρων) { }
  • Παράδειγμα 1: private void show() { }
  • Χρήση: Προβολή της προεπιλεγμένης μεθόδου.
package oopInterface7;

public interface InterA {
    public default void show1() {
        System.out.println("show1开始执行");
        show3();
    }

    public default void show2() {
        System.out.println("show2开始执行");
        show3();
    }

    //普通的私有方法,给默认方法服务的
    private void show3() {
        System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • Μορφή 2: όνομα μεθόδου τύπου ιδιωτικής στατικής τιμής επιστροφής (λίστα παραμέτρων) { }
  • Παράδειγμα 2: private static void method() { }
  • Χρήση: Εξυπηρετήστε στατικές μεθόδους.
package oopInterface7;

public interface InterB {
    public static void show1() {
        System.out.println("show1开始执行");
        show3();
    }

    public static void show2() {
        System.out.println("show2开始执行");
        show3();
    }

    //普通的私有方法,给静态方法服务的
    private static void show3() {
        System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

6. Εφαρμογή διεπαφής

1. Η διεπαφή αντιπροσωπεύει κανόνες και είναι μια αφαίρεση συμπεριφοράς. Εάν θέλετε μια τάξη να έχει συμπεριφορά, απλώς αφήστε την κλάση να εφαρμόσει την αντίστοιχη διεπαφή.
2. Όταν η παράμετρος μιας μεθόδου είναι μια διεπαφή, η διεπαφή μπορεί να μεταβιβαστείΌλα τα αντικείμενα της κλάσης υλοποίησης, αυτή η προσέγγιση ονομάζεται πολυμορφισμός διεπαφής.

7. Μοτίβο σχεδίασης προσαρμογέα

  • Το Design Pattern είναι ένα σύνολο ταξινομημένων και καταλογοποιημένων εμπειριών σχεδιασμού κώδικα που χρησιμοποιούνται επανειλημμένα, γνωστά στους περισσότερους ανθρώπους. Ο σκοπός της χρήσης μοτίβων σχεδίασης είναι η επαναχρησιμοποίηση του κώδικα, η ευκολότερη κατανόηση του κώδικα από τους άλλους, η διασφάλιση της αξιοπιστίας του κώδικα και η επαναχρησιμοποίηση του προγράμματος.

Οι προσαρμογείς μπορούν να χρησιμοποιηθούν για την απλοποίηση του κώδικα και την αποφυγή της ταλαιπωρίας που προκαλείται όταν υπάρχουν πάρα πολλές αφηρημένες μέθοδοι στη διεπαφή και χρειάζεται μόνο να χρησιμοποιήσουμε μέρος τους.
Τα βήματα γραφής είναι γενικά:
1. Γράψτε την ενδιάμεση κλάση XXXAdapter για την υλοποίηση της αντίστοιχης διεπαφής.
2. Εφαρμόστε κενές υλοποιήσεις αφηρημένων μεθόδων στη διεπαφή.
3. Αφήστε την πραγματική κλάση υλοποίησης να κληρονομήσει την ενδιάμεση κλάση και ξαναγράψτε τις απαιτούμενες μεθόδους.
4. Προκειμένου να αποτραπεί η δημιουργία αντικειμένων της κατηγορίας προσαρμογέων από άλλες κλάσεις, η ενδιάμεση κλάση προσαρμογέα διακοσμείται με abstract.

διεπαφή:

package AdapterDesignPattern;

public interface Inter {
    public abstract void method1();
    public abstract void method2();
    public abstract void method3();
    public abstract void method4();
    public abstract void method5();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Κατηγορία προσαρμογέα:

package AdapterDesignPattern;

public abstract class InterAdapter implements Inter {
    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public void method3() {

    }

    @Override
    public void method4() {

    }

    @Override
    public void method5() {

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Κατηγορία υλοποίησης:

package AdapterDesignPattern;

public class InterImpl extends InterAdapter {
    //我需要用到哪个方法,就重写哪个方法就可以了
    @Override
    public void method5() {
        System.out.println("只要用第五个方法");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10