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

标签 c# oop

假设我正在设计一个可以拾取各种工具并使用它们的机器人。 我会创建一个 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/

相关文章:

C# LINQ - 按属性对列表进行分组,然后按不同的组进行选择

c# - C# 是否支持任意精度算术?

php - 困惑于 PHP 中的依赖注入(inject)(类链)

c# - 在c#中处理多个数据库连接

C# 用户名比较(2 个字符串)

C# 在将字符串转换为 Int 方面需要帮助吗?

c# 重复事件(比如日历)

php - 从子访问父类的属性

c++ - 在网络应用程序中缓冲数据的 OOP 方法

java - java中的getters应该有验证吗?