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.
--Was ist eine abstrakte Klasse? ――Was macht Sie glücklich, wenn Sie eine abstrakte Klasse implementieren
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
}
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.
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.
Die Vorlagenmethode ist ein Entwurfsmuster, das abstrakte Klassen verwendet, um das Verarbeitungsframework in Oberklassen und den spezifischen Inhalt in Unterklassen zu definieren.
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.
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:
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