我有这样的初级班级蓝图:
class Human {
Human(){}
class Hair{
private int length;
Hair(){
this.length=10;
}
}
}
class Tools{
Tools(){}
class Scissors{
Scissors(){}
}
}
class HoldingScissors{
public void makeHairCut(Human theHuman){
theHuman.Hair.length = 5;
}
}
但是,我不知道如何将它们之间的关系联系起来。 我希望人类先“抓住”剪刀,然后才能剪发。 有人可以告诉我如何实现这个目标吗?
答案 0 :(得分:4)
HoldingScissor可能不应该是一个类,而是一个能够执行一类操作的属性。
然而,有一百万种方法可以对此进行建模。关于OO有两件事:消息传递和封装;不要只关注对象粒度,因为你会追逐错误的抽象abstract class Action {
public void perform();
}
public class CutHairsAction {
Human agent,target;
public CutHairsAction(Human agent, Human target) {
if (agent.getHolding() == null) throw new IllegalStateException("agent not holding scissors");
if (! agent.getHolding() instanceOf Scissor) throw new IllegalStateException("agent not holding scissors");
if (target.Hair.lenght < 5) throw new IllegalStateException("target hair short enough");
this.target = target;
this.agent = agent;
}
public void perform() {
target.Hair.length = 5;
}
}
答案 1 :(得分:2)
我认为你在这里缺少一些课程(更不用说这些课程应该是公开的 - 不是内部的,因为你已经写好了)。应该有Human
的子类Barber
(或者Stylist
)。 只有理发师应该被允许改变人类的发型(特定的人类可以接受#34; barber&#34; - 包括理发的人 - 嘿,人们剪掉自己的头发所有的时间!)。
我认为定义一个剪刀类是不合适的,除非你打算模拟剪刀的动作(用你的简单概念很明显你不打算模拟什么剪刀实际上做)。相反,理发师(或造型师)应该能够直接修改人类的剪发(让它保持真实 - 真的是这里的头发长度)。在现实生活中,理发师可能会使用剪刀(或剪切工),但你并没有将 的一部分建模,因此创建剪刀(或剪切工)课程是多余的。
如果您合法地拥有Scissors
(或Shearers)课程,那么您需要区分不同的剪刀(或剪切者)剪头发的方式。如果你没有这样的区别,那么拥有这个课程毫无意义。例如,钝刀可能会比锋利的剪刀剪掉头发。因此,如果理发师使用钝刀(或者等级为#34;无光泽&#34;),对于使用不同剪刀的同一个理发师来说,它可能会有不同的切割 - 如果他们所有切割相同,那么你是不是建模剪刀,因此不需要Scissors
类/对象。