2016-10-28 3 views
0

Ich habe das Beispiel, das in der unteren Abbildung gezeigt wird, analog zu einem realen Projekt gemacht, an dem ich arbeite. Ich implementiere dieses Projekt in C++.Vermeiden Sie Klassenexposition, während Sie eine Schnittstelle erhalten

Der Hauptpunkt dieses Beispiels ist, dass ich eine FruitGarden von denen ich weiß, dass es immer eine einzige AppleTree enthält. In FruitGarden 's Funktion StartHarvesting sollte überprüft werden, ob der AppleTree reif für die Ernte ist. Zu diesem Zweck habe ich eine Interface-Klasse erstellt.

Die Art, wie ich die Schnittstelle jetzt benutze, ist, indem ich eine Funktion GetTreePointer in Vegitation implementiere und sie auf eine IFoodTree umwandle (und auf NULL überprüfe). Das Problem, das ich darin sehe, ist, dass ich meinen gesamten Baum der Außenwelt aussetze (indem ich die GetTreePointer implementiere), die den Aufruf anderer öffentlicher Funktionen ermöglicht, die nicht außerhalb von Vegitation verwendet werden sollen.

Meine Hauptfrage ist: Was ist der beste Weg, um die Schnittstelle IFoodTree, die auf die AppleTree zeigt?

UML diagram

+0

Editiert, um es lesbarer zu machen, aber da ich die UML nicht aktualisieren kann, habe ich die "Vegitation" (=> Vegetation) verlassen. – MSalters

Antwort

0

Vielleicht sollten Sie nicht GetTreePointer() in Vegitation, bereitzustellen, die in Garden verwendet werden können, um zu überprüfen, ob es bis zur Ernte in Ordnung ist.

Um die Äpfel zu bekommen, in Vegitation hilft bool canHarvest() zu überprüfen, ob es die richtige Zeit ist, Äpfel zu ernten, und vector<Apple> harvest(), um die Früchte zu bekommen. Dadurch wird Tree außerhalb Vegitation nicht freigelegt.

Eine andere Möglichkeit, das zu erreichen, ist Vegitation als eine innere geschützte Klasse von Garden zu setzen.

0

Hier gibt es viele Möglichkeiten. Der einfachste kann virtual bool Vegetations::ReadyForHarvest() const { return false; } sein.

Eine andere einfache ist es, private Funktionen zu halten private. Wenn AppleTree::Foo nur von Vegetation abrufbar sein soll, sollte Vegetationprivate: virtual void Foo() = 0; definiert haben. Es ist ziemlich klar, dass Vegetation nicht über abgeleitete Klassen wissen sollte, das ist die Umkehr der Richtung der Vererbung und viel zu zerbrechlich. Stattdessen müssen abgeleitete Klassen das, was die Basisklasse verlangt, in Bezug auf reine virtuelle Funktionen implementieren. Der Compiler hilft Ihnen dabei.

Verwandte Themen