假设我正在设计一个可以拾取各种工具并使用它们的机器人。
我会创建一个 Robot 类,它有 Pickup 方法来选择我想要使用的工具。
对于每个工具,我都会为它创建一个类,例如,具有 Cut 方法的 Knife 类。
现在在 Robot 上调用 Pickup 方法后,我想告诉我的机器人进行切割。所以对于 OOP 概念,我必须告诉机器人,而不是刀? Cut 方法在 Knife 上,所以我该如何调用它?我必须在 Robot 上实现某种 UseToolCurrentlyHeld()
才能将我的命令传播到 Knife。或者我直接使用这个直接调用刀(我的机器人拿着):myrobot.ToolCurrentlyInHand.Cut()
我觉得很奇怪,父方法必须拥有一切来处理它们包含的类。现在我有重复的方法,比如 Knife 有 Cut()
而现在 Robot 必须有 UseCutOnKnife()
才能在 Knife 上调用 Cut()
因为好的 OOP 实践是将 Knife 抽象出来,让它感觉就像订购机器人一样,而不用担心 Knife 等内部信息。
另一个问题,如果我创作音乐,我会创建 Music
类,其中包含许多 Measure
类来存储音符信息。在一个 Measure 中,可以有许多 Note
类,其中 Note 类将包含诸如该音符在该小节中的位置或该音符播放多长时间等信息。现在我想在大约中间的第 45 小节上添加一个音符。要创建度量,我必须在 Music 上调用 CreateMeasure(45)
,然后在 Measure 上调用 CreateNote(0.5f)
?创建的方法是在父上的吗?如果现在我想将该音符更改为 0.25,那么负责更改 Note 的方法是 Note
类本身还是 Measure
类?或者我必须实现更改最顶层 Music
类的注释的方法?
这是我的类(class)的概述:
class Music
{
List<Measure> measures = new List<Measure>();
//methods...
}
class Measure
{
int measureNumber;
List<Note> notes = new List<Note>();
//methods...
}
class Note
{
float positionInMeasure; //from 0 to 1
}
现在音乐课是我现在必须通过音乐发布所有内容的最重要的部分?并链接方法以最终调用最里面的类?
最佳答案
您在这里需要的是所有工具都实现的通用接口(interface)。
例如。:
interface ITool {
void Use();
}
现在刀可以实现该接口(interface):
class Knife : ITool {
public void Use() {
//do the cutting logic
}
}
现在您将通过机器人上的 ITool 界面使用该工具,但不知道它是什么工具:
class Robot {
private ITool currentTool = null;
public void Pickup(ITool tool)
{
currentTool = tool;
}
public void UseTool() {
currentTool.Use();
}
}
你可以像这样调用 Pickup:
Robot robot = new Robot();
robot.Pickup(new Knife());
robot.UseTool();