[JAVA] Beispiel für die Verwendung der Schnittstelle

Einführung

Dies ist eine Schnittstellenversion von Beispiel für die Verwendung einer abstrakten Klasse. Ich kenne die Bedeutung und Definition der Schnittstelle, aber wann soll ich sie verwenden und welche guten Dinge gibt es? Hier ist ein Beispiel.

Plötzliche Schlussfolgerung. Es wird stark gegen Umbau sein.

Wie abstrakte Klasse / Generalisierung / Vererbung ist es resistent gegen Änderungen. Hier ist ein Beispiel für eine weitere Änderungsanforderung für das Programm, das in Beispiel für die Verwendung einer abstrakten Klasse eingeführt wurde.

Programm geändert werden

Lassen Sie uns zunächst das in Beispiel für die Verwendung einer abstrakten Klasse eingeführte Programm überprüfen.

Ein Programm zur Verwaltung von Druckern, das zunächst Tintenstrahldrucker und Laserdrucker verwaltete und eine Liste mit Druckerinformationen anzeigte. Es gab eine Umgestaltungsanforderung, um einen Punktdrucker als verwaltbaren Drucker hinzuzufügen, daher habe ich ein Programm erstellt, das gegen Umgestaltung durch Abstraktion (Generalisierung / Vererbung) stark ist.

Klassenstruktur: image.png

Es verallgemeinert die Mitgliedsvariablen mModelName (Modellname) und mPaper (verbleibende Papiermenge) und abstrahiert die Funktion getPrinterInfo (), die Druckerinformationen zurückgibt.

Neue Anforderungen an den Umbau

Nehmen wir dieses Mal an, dass es eine weitere Anforderung gibt, "dem zu verwaltenden Druckertyp einen 3D-Drucker hinzuzufügen und auch die Druckerinformationen anzuzeigen".

Sie können AbstractPrinter nicht wie beim Hinzufügen eines Punktdruckers erben. Da 3D-Drucker jedoch nicht auf Papier drucken, ist mPaper (verbleibende Papiermenge) nicht erforderlich. Nicht verwendete Mitgliedsvariablen sollten die Wartung des Programms nicht beeinträchtigen.

Warum also nicht eine unabhängige 3D-Druckerklasse erstellen? Dann wird es redundant wie ein Programm, das die abstrakte Klasse in [Beispiel für die Verwendung einer abstrakten Klasse] nicht verwendet (https://qiita.com/ats_y/items/6088aada15b22c2fef75).

Was soll ich dann tun? Lösen wir es mit der Schnittstelle.

Versuchen Sie, Änderungen über die Schnittstelle vorzunehmen

Erstellen Sie zunächst die Schnittstelle.


//
//Druckerschnittstelle
//
interface IPrinter{
    
    //Gibt Listendruckerinformationen zurück
    String getPrinterInfo();
}

Erstellen Sie eine 3D-Druckerklasse, die den IPrinter der Druckerschnittstelle implementiert.

//
//3D Drucker
//
class ThreeDPrinter implements IPrinter{

    //Materialkapazität
    private int mMaterial;
    
    //Konstrukteur
    public ThreeDPrinter(int material){
        mMaterial = material;
    }
    
    //Methode zum Zurückgeben von Druckerinformationen für die Listenanzeige
    public String getPrinterInfo(){
        
        return "[3D]3D-Drucker in Entwicklung" + "Druckkapazität:" + mMaterial + "Liter";
    }
}

Implementieren Sie die Druckerschnittstelle IPrinter auch in der AbstractPrinter-Klasse.

//
//Drucker abstrakte Klasse
//
abstract class AbstractPrinter implements IPrinter{
    //Abkürzung
}

Ändern Sie den Typ des Arrays, in dem die zu verwaltenden Drucker gespeichert sind, von AbstractPrinter in IPrinter.

    public static void main(String[] args) throws Exception {

        //Registrieren Sie den zu verwaltenden Drucker.
        IPrinter[] printers = {
            new InkjetPrinter("Epson P1", 10),
            new InkjetPrinter("Canon C1", 20),
            new LaserPrinter("Xerox X1", 100),
            new LaserPrinter("Richo R1", 50),
            new LaserPrinter("Richo R2", 200),
            new DotimpactPrinter("NEC N1", 100),
            new DotimpactPrinter("Oki O1", 50),
            new ThreeDPrinter(5),
        };
        
        //Listen Sie die verwalteten Drucker auf.
        for(int i = 0; i < printers.length; i++ ){
            String printerInfo = printers[i].getPrinterInfo();
            System.out.println(printerInfo);
        }
    }

nur das. Lass es uns laufen.

Ausführungsergebnis


[Inkjet]Epson P1 Anzahl der bedruckbaren Blätter: 10
[Inkjet]Canon C1 druckbare Nummer: 20
[Laser-]Xerox X1 Anzahl der bedruckbaren Blätter: 100
[Laser-]Ricoh R1 Anzahl der bedruckbaren Blätter: 50
[Laser-]Richo R2 Anzahl der bedruckbaren Blätter: 200
[Punktaufprall]NEC N1 Anzahl der bedruckbaren Blätter: 100
[Punktaufprall]Oki O1 Anzahl der bedruckbaren Blätter: 50
[3D]3D-Drucker in Entwicklung Druckkapazität: 5 Liter

Es ist fertig! Wie bei Beispiel für die Verwendung einer abstrakten Klasse wurde die Anzahl der zu verwaltenden Variablen nicht erhöht, und der Anzeigeprozess konnte geändert werden. https://paiza.io/projects/wSSYJVnwbZfsI0vXHrsGjg

Klassenstruktur: image.png

Zusammenfassung

Die Schnittstelle ist auch ein Typ. Es kann also als Variablentyp verwendet werden. ** Eine Schnittstellestypvariable kann Objekte der Klasse enthalten, die diese Schnittstelle implementiert. ** ** **

//Registrieren Sie den zu verwaltenden Drucker.
IPrinter[] printers = {
    new InkjetPrinter("Epson P1", 10),
    //Abkürzung
    new ThreeDPrinter(5),
};

Sowohl die ThreeDPrinter-Klasse als auch jede von AbstractPrinter abgeleitete Klasse implementieren die IPrinter-Schnittstelle, sodass Sie dieses Objekt in einer Variablen vom Typ IPrinter speichern können. Die Variable vom Typ IPrinter, die die Funktion getPrinterInfo () definiert, kann aufgerufen werden, da ich die Details der darin enthaltenen Objekte nicht kenne, aber sicher ist, dass sie die Funktion getPrinterInfo () implementiert. Ich werde.

//Listen Sie die verwalteten Drucker auf.
for(int i = 0; i < printers.length; i++ ){
    // printers[i]Ich weiß nicht, was drin ist,
    // printers[i]Ist ein IPrinter-Typ
    // getPrinterInfo()Ist implementiert, damit Sie es aufrufen können.
    String printerInfo = printers[i].getPrinterInfo();
    System.out.println(printerInfo);
}

Recommended Posts

Beispiel für die Verwendung der Schnittstelle
[Android] Beispiel für eine Schnittstelle
Anwendungsbeispiel für die innere Klasse
Java (Schnittstelle)
neue Schnittstelle
[Java] -Schnittstelle
Beispieltitel
irb Verwendung