1

如果我有一个实现 PetBase 的 Cat 和 Dog 类。他们每个人都持有一个名为 Owner 的对象。Owner 持有一个名为 Emotion 的对象。我将如何根据 Emotion 类是属于 Cat 还是 Dog 来限制访问某些属性或函数或函数参数?像这样:

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?

在这个例子中,我想限制 Cat 主人不能将参数传递给 SetFearLevel(),但要让 Dog 主人可以灵活地根据自己的意愿害怕(即能够将参数传递给 SetFearLevel ())。

我必须在设计中改变什么?

[编辑]

这是 Jordao 和 DavidFrancis 的答案之间的折腾。最后,由于应用程序的树结构性质,我选择了 DavidFrancis 的设计。

4

3 回答 3

1

SetFearLevel 是一个不同的签名,因此您需要基本 Emotion 类型的 2 个不同子类型。
然后,您需要为每种宠物类型设置一个单独的所有者子类型。
返回类型通常可以是 Covariant(即子类型),因此每个所有者子类型都可以返回适用于该所有者的特定 Emotion 子类型。

于 2012-07-10T21:54:03.170 回答
1

您可以在类本身中封装对所需功能的访问:

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

小心得墨忒耳幻化器。

于 2012-07-11T00:39:17.497 回答
0

您的联系方式是错误的。你想从owner.SetFearLevel(5). 主人owner必须了解他/她自己的宠物和他/她自己的情绪。因此,该方法可以检查“我拥有猫还是狗?” 然后正确设置它的情感实例:“我不怕忽略那个参数5(因为我有一只猫)。” 或者换一种说法,主人指的是宠物,而不是主人的宠物。

为了更清楚地看到这一点,请注意您的模型很容易允许一个人拥有任意数量的狗和猫。你总是可以创造一个新的宠物,让这个倒霉的人成为主人。这可能很有用,但它使计算他/她的恐惧程度变得相当复杂。从某种意义上说,这几乎是不可能的,因为对于任何给定的宠物,您都认识它的主人,而对于任何给定的宠物,您都不认识这只宠物。(我承认,这是一个很容易解决的问题。)

因此,在 Owner 类中引用宠物(或宠物——也许使用最大恐惧因子)并将 SetFearLevel 方法从 Emotion 类移至 Owner 类,一切都应该很好地结合在一起。

于 2012-07-11T19:50:36.133 回答