2016-10-28 6 views
0

下の図のような例を私が実際に使っているプロジェクトにしました。私はこのプロジェクトをC++で実装しています。インターフェイスを取得中にクラスへのエクスクルードを防止する

この例の主なポイントは、FruitGardenがあり、そのうちの1つが常にAppleTreeであることがわかっています。 FruitGardenの機能StartHarvestingでは、AppleTreeが収穫の準備が整っているかどうかを確認する必要があります。この目的のために、私はインターフェイスクラスを作成しました。

ここでインターフェイスを使用している方法は、GetTreePointerVegitationに実装し、IFoodTreeにキャストして(NULLをチェックする)ことです。私が見ている問題は、Vegitation以外で使用しようとしていない他のパブリック関数の呼び出しを可能にして、私がフル・ツリーを(GetTreePointerを実装することによって)外部に公開していることです。

私の主な質問は:AppleTreeを指しているインターフェイスIFoodTreeを取得する最善の方法は何ですか?

UML diagram

+0

読みやすくするために編集しましたが、私はUMLを更新できないので、 "Vegitation"(=>植生)を残しました。 – MSalters

答えて

0

たぶん、あなたはそれが収穫にOKであるかどうかをチェックするGardenで使用することができるVegitationGetTreePointer()を、提供してはなりません。

リンゴを得るためには、Vegitationbool canHarvest()は果物を得るのに適切な時期であることを確認するのに役立ちます。vector<Apple> harvest()そうすることで、Vegitationの外にTreeを公開することはありません。

これを達成する別の方法は、Gardenの内部保護クラスとしてVegitationを入れることです。

0

ここにはたくさんのオプションがあります。一番簡単なのはvirtual bool Vegetations::ReadyForHarvest() const { return false; }です。

別の簡単なものではprivateプライベートの機能を維持することです。 AppleTree::FooVegetationから呼び出し可能であることが意図されている場合、Vegetationprivate: virtual void Foo() = 0;と定義する必要があります。 Vegetationが派生クラスについて知ってはならないことは明らかです。それは継承の方向性を逆転させ、脆弱すぎます。代わりに、派生クラスは、純粋仮想関数の観点から、基本クラスが要求するものを実装しなければなりません。コンパイラはこれを助けます。

関連する問題