Vor kurzem habe ich angefangen, mich mit OOP zu beschäftigen, und jetzt bin ich so weit, dass ich umso verwirrter werde, je mehr ich über die Unterschiede zwischen abstrakten Klassen und Schnittstellen lese. Bisher kann keiner von beiden instanziiert werden. Schnittstellen sind mehr oder weniger strukturelle Entwürfe, die das Gerüst bestimmen, und Zusammenfassungen unterscheiden sich dadurch, dass sie Code teilweise implementieren können.
Ich möchte mehr über diese durch meine spezifische Situation lernen. Hier ist ein Link zu meiner ersten Frage, wenn Sie ein wenig mehr Hintergrundinformationen wünschen: Was ist ein gutes Designmodell für meine neue Klasse?
Hier sind zwei Klassen, die ich erstellt habe:
class Ad {
$title;
$description
$price;
function get_data($website){ }
function validate_price(){ }
}
class calendar_event {
$title;
$description
$start_date;
function get_data($website){ //guts }
function validate_dates(){ //guts }
}
Sie sehen also, dass diese Klassen fast identisch sind. Hier nicht gezeigt, aber es gibt andere Funktionen like get_zip()
, save_to_database()
die in meinen Klassen üblich sind. Ich habe auch andere Klassen Cars and Pets hinzugefügt, die alle gängigen Methoden und natürlich die für diese Klassen spezifischen Eigenschaften aufweisen (z. B. Kilometerstand, Gewicht).
Jetzt habe ich gegen das DRY- Prinzip verstoßen und verwalte und ändere denselben Code in mehreren Dateien. Ich habe vor, mehr Klassen wie Boote, Pferde oder was auch immer zu haben.
Also würde ich hier eine Schnittstelle oder eine abstrakte Klasse verwenden? Soweit ich mit abstrakten Klassen vertraut bin, würde ich eine Superklasse als Vorlage mit allen in die abstrakte Klasse eingebauten gemeinsamen Elementen verwenden und dann nur die Elemente hinzufügen, die in zukünftigen Klassen speziell benötigt werden. Beispielsweise:
abstract class content {
$title;
$description
function get_data($website){ }
function common_function2() { }
function common_function3() { }
}
class calendar_event extends content {
$start_date;
function validate_dates(){ }
}
Oder würde ich eine Schnittstelle verwenden und, weil diese so ähnlich sind, eine Struktur erstellen, die jede Unterklasse aus Integritätsgründen verwenden muss, und es dem Endentwickler überlassen, der diese Klasse ausarbeitet, um für jede der Klassen verantwortlich zu sein Details sogar der allgemeinen Funktionen. Meiner Meinung nach müssen einige "gemeinsame" Funktionen in Zukunft möglicherweise an die Bedürfnisse ihrer jeweiligen Klasse angepasst werden.
Trotz alledem, wenn Sie glauben, dass ich das Was und Warum von abstrakten Klassen und Schnittstellen insgesamt missverstehe, lassen Sie auf jeden Fall eine gültige Antwort zu, damit Sie aufhören, in diese Richtung zu denken, und schlagen Sie den richtigen Weg vor, um fortzufahren!
Vielen Dank!