7

我不确定我是否疯狂地违反了 OOP 概念。

假设有一个Car类“具有” anEngine和 a Tank

Engine运行时,它会从那里取油Tank说每个循环一个单元一个单元,尽管油是不可数的)

应该如何Engine从那里取油Tank?(当两者都是Car?)

实际上Engine应该不断地“供应”石油,而不是“获取”石油。
应该有"OilCirculatingSystem"哪一个从那里得到油Tank
并供应到Engine
我如何在课堂上为这个系统建模?
有合适的设计模式吗? 在此处输入图像描述

** * 编辑:简而言之,如何实现“油流TankEngine?(阀门打开时是否有Oil责任从Tank流向Engine

4

4 回答 4

4

对不起,如果它烧伤大脑。缺少方法的实现,但你明白我希望的想法。

class Tank
{
    Oil oil;

    public Tank(OilPipe pipe)
    {
        pipe.OilNeeded += new EventHandler<OilNeededEventArgs>(pipe_OilNeeded);
    }

    public void FillOil(Oil oil) { }

    void pipe_OilNeeded(object sender, OilNeededEventArgs e)
    {
        e.Oil = oil.SubtractLiters(5);
    }
}

class OilPipe
{
    public event EventHandler<OilNeededEventArgs> OilNeeded;

    public Oil SuckOil();
}

class Piston
{
    public void Move() { }
}

class Oil
{
    public Energy Burn() { }
}

class Energy
{
    public void Push(Piston piston) { }
}

class Engine
{
    OilPipe oilPipe;

    public Engine(OilPipe oilPipe, Piston piston)
    {
        this.oilPipe = oilPipe;
    }

    public void MovePiston()
    {
        Oil oil = oilPipe.SuckOil();
        Energy energy = Burn(oil);
        energy.Push(piston);
    }
}

class Car
{
    Engine engine;

    public Car(Engine engine, Tank tank)
    {

    }

    public void Accelerate()
    {            
         engine.MovePiston();
    }
}
于 2011-10-22T16:26:30.980 回答
3

汽车类比从来都不是完美的,因为汽车和发动机实际上是非常复杂的系统。你必须忽略很多东西来简单地建模它们。您的问题是,您似乎一开始并不了解引擎的工作原理。

油底壳是发动机的一部分,而不是汽车的一部分。油箱是汽车的一部分,但不是发动机。您有一个油泵(也是发动机的一部分),将油泵入发动机的气缸。大多数汽车(也许是所有汽车)都不会“检查油位”并拒绝启动。如果没有足够的油,发动机就会卡住。同样,如果它没有得到足够的汽油,它不会检查油箱的油位。它只是用完了燃料。

它会更像这样:

class Car
{
    Engine engine;
    GasTank gasTank;

    StartEngine() { engine.Start(); }
}

class Engine
{
    Timer timer;
    OilPan oilPan;
    OilPump oilPump;
    public Engine() { oilPump = new OilPump(oilPan, this); }
    Start() { timer.Start(oilPump); }
    InjectOil() {}
}

class Timer
{
    OilPump op; // This is a reference
    public Timer(OilPump op) { _op = op; }
    Revolve() { op.Pump(); }
}
class OilPump {
    OilPan _oilPan; // Reference
    Engine _engine; // Reference

    OilPump(OilPan oilPan, Engine engine) { _oilPan = oilPan; _engine = engine; }
    Pump() { _engine.InjectOil(_oilPan.GetOil); }
}

计时器代表发动机的转速,当它旋转时,它会启动油泵,将油泵入气缸。石油通常不像燃料那样被“消耗”。它被回收。它会随着时间的推移而分解,并且在某些状况不佳的发动机中,它会燃烧。

油泵参考代表发动机和油泵之间的机械连接(通常是齿轮转动它)。Timer 没有油泵,它有一个油泵的参考。

油箱将以类似的方式工作。

同样,这一切都是不完美的(非常不完美),因为缺少太多东西。

于 2011-10-22T16:47:20.143 回答
2

我会说它Car本身就是OilCirculatingSystem.

class Car
{
   Tank tank;
   Engine engine;
   start()
   {
   //whatever
   }
   feedEngine()
   {
      while ( tank.hasOil() )
      {
          tank.getOil();
          engine.giveOil();
      }
   }
}

Car本身已经是将所有组件连接在一起的类,为什么还需要另一个呢?

于 2011-10-22T16:08:27.957 回答
1

供应是连续的这一事实意味着必须在指定的时间间隔后对其进行检查。如果这不是您想要的,您可能需要澄清您的问题。

解决这个问题的最合乎逻辑的方法(假设您没有基于事件或信号/插槽编程)将让汽车检查发动机的状态,您选择的每个时间间隔,如果发动机需要更多的油,汽车应该从油箱中读取一些数据并将其传递给引擎。

这是一个简单的伪代码示例来演示我的意思:

class Engine
{
    void start()
    {
        while(true)
        {
            // do engine stuff here
        }
    }

    void getOil(int amount)
    {
        // do stuff with oil
    }
}

class Tank
{
    int oilAmount
    boolean hasOil

    int giveOil()
    {
        return oilAmount
    }
}

class Car
{
    Tank tank
    Engine engine

    void start()
    {
        engine.start()
        while(true)
        {
            engine.getOil(tank.giveOil())
            sleep(100)
        }
    }
}
于 2011-10-22T16:08:12.023 回答