1

PetBase を実装する Cat および Dog クラスがあるとします。そして、それぞれが Owner というオブジェクトを保持しています。そして Owner は Emotion というオブジェクトを保持しています。Cat または Dog のどちらに属しているかに基づいて、Emotion クラスの特定のプロパティ、関数、または関数パラメーターへのアクセスを制限するにはどうすればよいですか? そのようです:

Dog d = new Dog();
d.Owner.Emotion.SetFearLevel(10); // dog owners can have a fear level from 1-10 so let the user decide.
Cat c = new Cat();
c.Owner.Emotion.SetFearLevel(); // all cat owners have the same fear level so I don't want the user to be able to pass in a parameter but still be able to call SetFearLevel(). How do I enforce this?

この例では、猫の飼い主がパラメーターを SetFearLevel() に渡せないように制限したいのですが、犬の飼い主には、必要なだけ恐れる柔軟性を与えます (つまり、パラメーターを SetFearLevel に渡すことができます)。 ()))。

デザインで何を変更する必要がありますか?

[編集]

それは Jordao の答えと DavidFrancis の答えの間のトスでした。最終的に、アプリのツリー構造の性質から、DavidFrancis のデザインを採用しました。

4

3 に答える 3

1

クラス自体で必要な機能へのアクセスをカプセル化できます。

dog.setOwnerFearLevel(5);
cat.setOwnerFear();

Demeter トランスモグリファイヤーには注意してください。

于 2012-07-11T00:39:17.497 に答える
1

SetFearLevel は別のシグネチャであるため、ベース Emotion タイプの 2 つの異なるサブタイプが必要です。
次に、ペットの種類ごとに個別の所有者サブタイプが必要になります。
通常、戻り値の型は共変 (つまり、サブタイプ) にすることができるため、各所有者のサブタイプは、その所有者に適用される特定の Emotion サブタイプを返すことができます。

于 2012-07-10T21:54:03.170 に答える
0

Your linkages are the wrong way around. You want to start with owner.SetFearLevel(5). Owner owner has to know about his/her own pet and his/her own emotions. Hence the method can check, "Do I own a cat or a dog?" and then set it's emotion instance properly: "I am not afraid dispite that parameter of 5 (because I own a cat)." Or to put it another way, the owner references the pet, not the pet the owner.

To see this more clearly, note that your model easily allows one person to own any number of dogs and cats. You can always create a new pet and make this hapless person the owner. This can be useful, but it makes calculating his/her fear level rather complicated. In a sense, it's almost impossible, because, while for any given pet you know the owner, given any owner you don't know the pet. (An easily fixed problem, I admit.)

So, reference the pet (or pets--maybe use the maximum fear factor) in the Owner class and move the SetFearLevel method to the Owner class from the Emotion class, and everything should fit together nicely.

于 2012-07-11T19:50:36.133 に答える