gpt4 book ai didi

c# - 隐藏父类的实现细节

转载 作者:太空狗 更新时间:2023-10-30 00:15:49 26 4
gpt4 key购买 nike

假设我正在设计一个可以拾取各种工具并使用它们的机器人。我会创建一个 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 上添加一个音符。要创建 Measure,我必须在 Music 上调用 CreateMeasure(45),然后在 Measure 上调用 CreateNote(0.5f) 吗?创建的方法是在父类上吗?如果现在我想将该音符改为测量值的 0.25,负责更改音符的方法是 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();

关于c# - 隐藏父类的实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com