隐藏父类的实现细节

5ar*_*gon 4 c# oop

假设我正在设计一个可以拾取各种工具并使用它们的机器人.我会创建一个Robot类,它有Pickup方法来选择我想要使用的工具.对于每个工具,我会为它创建一个类,比如Knife类,它有Cut方法.现在在机器人上调用Pickup方法之后,我想告诉我的机器人要切割.所以对于OOP概念我必须告诉机器人,而不是刀?而且Cut方法在Knife上,那我怎么能调用呢?我必须UseToolCurrentlyHeld()在Robot上实现某种将命令传播给Knife.或者我直接使用这个直接调用刀(我的机器人手持):myrobot.ToolCurrentlyInHand.Cut()

我觉得父方法必须拥有一切来处理它们包含的类是很奇怪的.现在我有了重复的方法,比如Knife已经Cut()和现在机器人必须UseCutOnKnife()只需要Cut()在Knife 上调用,因为良好的OOP练习是将刀抽出并使其感觉就像订购机器人而不用担心Knife等内部信息.

另一个问题,如果我创作音乐,我会创建Music包含许多Measure类来存储音符信息的类.在一个测量中,里面可以有许多Note类,其中Note类将具有信息,例如,该音符在该音符中的位置,或该音符播放的时间长度.现在我想在措施中间放置一个关于措施45的注释.要创建测量我必须调用CreateMeasure(45)音乐,然后调用CreateNote(0.5f)测量?要创建的方法是在父类上吗?如果现在我想将该注释更改为在度量上为0.25,那么负责更改Note的方法是Note类本身或Measure类?或者我必须实现方法来更改最顶级的笔记Music

这是我的课程概述:

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
}
Run Code Online (Sandbox Code Playgroud)

现在音乐课是最重要的,我现在必须通过音乐发布一切?并链接方法最终调用最内层的类?

Pet*_*nov 5

您需要的是所有工具实现的通用接口.

例如:

interface ITool {
    void Use();
}
Run Code Online (Sandbox Code Playgroud)

现在刀可以实现该接口:

class Knife : ITool {
    public void Use() {
        //do the cutting logic
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您将通过机器人上的ITool界面使用该工具,而不知道它是什么工具:

class Robot {
    private ITool currentTool = null;

    public void Pickup(ITool tool)
    {
        currentTool = tool;
    }

    public void UseTool() {
        currentTool.Use();
    }
} 
Run Code Online (Sandbox Code Playgroud)

你可以像这样调用Pickup:

 Robot robot = new Robot();
 robot.Pickup(new Knife());
 robot.UseTool();
Run Code Online (Sandbox Code Playgroud)