[JAVA] Warum eine abstrakte Klasse implementieren (Abstract)

Ich war mir nicht ganz sicher, welche Vorteile es hat, eine abstrakte Klasse zu implementieren, und fasste zusammen, was eine abstrakte Klasse ist und welche Absicht (und welche Art von Verdienst) sie hat, eine abstrakte Klasse zu implementieren.

Inhalt dieses Artikels

--Was ist eine abstrakte Klasse? ――Was macht Sie glücklich, wenn Sie eine abstrakte Klasse implementieren

Was ist eine abstrakte Klasse?

Eine abstrakte Klasse ist eine Klasse ** mit einer oder mehreren abstrakten Methoden. Abstrakte Klassen haben für sich genommen keine Bedeutung und funktionieren nur, wenn sie von Unterklassen geerbt werden.

abstrakter Klassenklassenname{
Abstrakte Methode
}

Was ist eine abstrakte Methode?

Eine abstrakte Methode ist eine Methode, die in der folgenden Form geschrieben ist.

abstrakter Klassenklassenname{
abstract Rückgabetyp Methodenname(Argumenttyp Argument);
}

Wie oben erwähnt, definiert eine abstrakte Methode nur den Rückgabetyp, den Methodennamen, den Argumenttyp und die Anzahl der Argumente nach der Zusammenfassung und hat keine Implementierung. Die konkrete Implementierung wird in einer Unterklasse implementiert, die von dieser abstrakten Klasse erbt.

Merkmale der abstrakten Klasse

  1. Unterklassen, die von der abstrakten Klasse erben, müssen die abstrakte Methode in der abstrakten Klasse überschreiben
  2. Sie müssen den Konstruktor in eine Unterklasse schreiben
  3. Kann nicht direkt instanziiert werden
  4. Mehrfachvererbung ist nicht möglich

Absicht, abstrakte Klassen zu implementieren

Der Vorteil der Implementierung einer abstrakten Klasse ist * "Eine Unterklasse, die eine abstrakte Klasse erbt, muss die abstrakte Methode in der abstrakten Klasse überschreiben" *, beschrieben in Feature 1 der abstrakten Klasse.

Die spezifischen Vorteile, die dies bedeutet, sind ... ** Sie können Regeln auf Implementierungsebene erstellen, wenn Sie mit mehreren Personen entwickeln! ** ist. Trotzdem glaube ich nicht, dass Sie diesen Wert ehrlich verstehen können, wenn Sie nicht eine groß angelegte Entwicklung in einem Unternehmen erleben. (Ich habe überhaupt nicht verstanden: Regenschirm :)

Nehmen wir nun an, wir führen eine groß angelegte Entwicklung durch (Entwicklung mit mehreren Personen und die Menge an Code beträgt Tausende bis Hunderttausende von Zeilen), und wir werden dem Programm einfache Funktionen und Bildschirme hinzufügen. Angenommen, Sie müssen das Problem beheben.

Bei einer einfachen Funktionsaddition ist die Logik der Methode etwas anders, aber in vielen Fällen entspricht das, was Sie tun möchten, in etwa der Klasse, die Sie bereits implementiert haben. In einem solchen Fall kann es einige Zeit dauern, bis festgestellt wird, welche Verarbeitung ausgeführt wird, wenn der Methodenname je nach Klasse unterschiedlich ist, obwohl dieselbe Verarbeitung ausgeführt wird: schwerwiegend:

Wenn Sie sicherstellen, dass es durch erzwungenes Überschreiben geschrieben wird, was ein Merkmal abstrakter Klassen ist, können die folgenden Effekte erzielt werden: sparkles :: sparkles:

Durch die Implementierung einer abstrakten Klasse können Sie ** Regeln auf Implementierungsebene erstellen, wenn Sie mit mehreren Personen entwickeln **! !! Dies ist einer der Gründe und die Absicht, abstrakte Klassen zu implementieren.

Als nächstes werde ich Entwurfsmuster und Beispielprogramme vorstellen, die abstrakte Klassen verwenden.

Was ist das Muster der Vorlagenmethode?

Die Vorlagenmethode ist ein Entwurfsmuster, das abstrakte Klassen verwendet, um das Verarbeitungsframework in Oberklassen und den spezifischen Inhalt in Unterklassen zu definieren.

Zeichen der Vorlagenmethode

Beispiel für die Implementierung der Vorlagenmethode

Aus Gründen der Übersichtlichkeit ist dies ein sehr einfaches Beispielprogramm, das nur das Protokoll ausgibt. Die Player-Klasse spielt die Rolle von AbstractClass in den Zeichen der Template-Methode, und die MusicPlayer-Klasse und die VideoPlayer-Klasse spielen die Rolle von ConcreteClass. Das Klassendiagramm ist wie folgt.

Player.png

Werfen wir einen Blick auf das Programm. Erstens hat der Superklasse-Spieler drei abstrakte Methoden: Die konkrete Implementierung der abstrakten Methode erfolgt in jeder der Unterklassen MusicPlayer und VideoPlayer.

public abstract class Player {
    abstract void read();
    abstract void write();
    abstract void Playback();
}

Die MusicPlayer-Klasse und die VideoP-Klasse, die von Player erben, überschreiben jeweils alle abstrakten Methoden in der Player-Klasse und beschreiben den Verarbeitungsinhalt. Der Verarbeitungsinhalt kann wie unten gezeigt in Unterklassen unterteilt werden. Mit anderen Worten, selbst wenn der Name der geerbten Methode identisch ist, kann der Verarbeitungsinhalt für jede geerbte Unterklasse geändert werden. Die Unterklassen MusicPlayer und VideoPlayer lauten wie folgt.

public class MusicPlayer extends Player {

   
    @Override
    void read() {
        Log.d("Music Player","read");
    }

    @Override
    void write() {
        Log.d("Music Player","write");
    }

    @Override
    void playback() {
        Log.d("Music Player","playback");
    }
}
public class VideoPlayer extends Player {

    @Override
    void read() {
        Log.d("Video Player","read");
    }

    @Override
    void write() {
        Log.d("Video Player","write");
    }

    @Override
    void palyback() {
        Log.d("Video Player","playback");
    }
}

Endlich die Hauptklasse. Hier ist der Punkt!

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MusicPlayer musicplayer = new MusicPlayer();
        VideoPlayer videoplayer = new VideoPlayer();

        Player[] player = {musicplayer,videoplayer};
        for(int i=0; i<player.length; i++) {
            player[i].read();
            player[i].write();
            player[i].playback();

        }

    }

}

In der Hauptklasse sind die MusicPlayer-Instanz und die VideoPlayer-Instanz in einem Player-Array zusammengefasst. Dann wird es in einer for-Schleife gedreht, um drei Methoden aufzurufen. In diesem Teil geht es darum, dass die in Player [i] gespeicherte Instanz den Unterklassentyp nicht mit instanceof etc .: Point_up:

Dies ist möglich, weil es eine gemeinsame Superklasse namens Player gibt. Auf diese Weise ist "Sicherstellen, dass jede einer Variablen vom Typ einer Oberklasse zugewiesene Unterklasseninstanz ordnungsgemäß funktioniert" ein allgemeines Vererbungsprinzip, das nicht auf das Muster der Vorlagenmethode beschränkt ist. Sogenannter ** Polymorphismus **.

Was ist, wenn Sie das Muster der Vorlagenmethode nicht verwenden? MusicPlayer und VideoPlayer müssen getrennt werden und Instanzen jeder Klasse müssen separat erstellt werden.

Mit anderen Worten Durch die Einführung einer abstrakten Klasse ** können Sie der Referenzvariablen einer Oberklasse (Player) Instanzen anderer Unterklassen (MusicPlayer und VideoPlayer) zuweisen, sodass Sie für jede eine einheitliche Beschreibungsmethode verwenden können. Sie können die Override-Methode von! Ich bin froh, dass ** (^^): white_sun_small_cloud:

schließlich

Ich schrieb darüber, warum ich eine abstrakte Klasse implementiere, auch weil ich mir nicht sicher war. Das Implementieren einer abstrakten Klasse erhöht die Codemenge und verkompliziert die Struktur. Daher ist es nicht wünschenswert, eine abstrakte Klasse für irgendetwas zu implementieren, aber es hat solche Vorteile. Ich würde mich freuen, wenn Sie vermitteln könnten.

Ich habe auch ein Entwurfsmuster namens Vorlagenmethode eingeführt, das abstrakte Klassen und ein Implementierungsbeispiel verwendet. Ich wäre Ihnen jedoch dankbar, wenn Sie auf Fehler hinweisen könnten.

Recommended Posts

Warum eine abstrakte Klasse implementieren (Abstract)
Java (abstrakte Klasse)
[Java] Abstrakte Klasse
Warum Java die letzte Klasse A zulässt {abstrakte Klasse B {}}
Über die abstrakte Klasse von Java
Schnittstelle / Abstrakte Klasse / Überschreiben
Java-Lernnotiz (abstrakte Klasse)
Erstellen Sie mit JAVA eine unveränderliche Klasse
Warum werden Klassenvariablen benötigt? [Java]
Unterschied zwischen Schnittstelle und abstrakter Klasse