Конструкция ООП: Автомобиль - Соединение между баком и двигателем
Я не уверен, что я безумно нарушаю концепции ООП.
Скажи, что есть Car
класс, который "имеет" Engine
и Tank
,
Когда Engine
работает, он будет брать масло из Tank
(скажем, единица за единицу за цикл, хотя масло неисчислимо)
Как следует Engine
получить масло из Tank
? (Когда оба поля Car
?)
На самом деле Engine
следует постоянно "поставлять" масло, а не "получать" масло.
Там должен быть "OilCirculatingSystem"
который получает нефть из Tank
и поставки в Engine
,
Как я могу моделировать эту систему в классах?
Есть ли подходящий шаблон дизайна?
** * Редактировать: просто, как получить "Поток нефти" из Tank
в Engine
? (Это Oil
ответственность вытекает из Tank
в Engine
когда клапан открывается?
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();
}
}
Автомобильные аналогии никогда не бывают идеальными, потому что автомобили и двигатели на самом деле очень сложные системы. Вы должны игнорировать многие вещи, чтобы просто смоделировать их. Ваша проблема в том, что вы, кажется, не понимаете, как двигатель работает в первую очередь.
Масляный поддон является частью двигателя, а не автомобиля. Бензобак является частью автомобиля, но не двигателя. У вас есть масляный насос (также часть двигателя), который качает масло в цилиндры двигателя. Большинство автомобилей (возможно, всех) не "проверяют уровень масла" и отказываются заводиться. Двигатель просто закроется, если не будет достаточно масла. Точно так же, если он не получает достаточно газа, он не проверяет уровень бензобака... у него просто заканчивается топливо.
Это было бы больше так:
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); }
}
Таймер представляет обороты двигателя, так как он вращается, он приводит в действие масляный насос, который закачивает масло в цилиндры. Масло обычно не "расходуется", как топливо. Это переработано. Со временем он может сломаться, а в некоторых двигателях, которые находятся в плохом состоянии, он может сгореть.
Ссылка "Масляный насос" представляет собой механическую связь между двигателем и масляным насосом (обычно зубчатые колеса поворачивают его). Таймер не имеет масляного насоса, он имеет ссылку на масляный насос.
Бензобак будет работать аналогичным образом.
Опять же, это все несовершенно (очень несовершенно), потому что так много не хватает.
Я бы сказал, что Car
сам по себе OilCirculatingSystem
,
class Car
{
Tank tank;
Engine engine;
start()
{
//whatever
}
feedEngine()
{
while ( tank.hasOil() )
{
tank.getOil();
engine.giveOil();
}
}
}
Car
сам по себе класс, соединяющий все ваши компоненты вместе, зачем вам еще один?
Тот факт, что подача является непрерывной, означает, что она должна быть проверена через определенный промежуток времени. Если это не то, что вы ищете, вам, возможно, придется уточнить ваш вопрос.
Наиболее логичным подходом к этой проблеме (при условии, что у вас нет событийного программирования или программирования сигнала / слота) было бы, чтобы автомобиль проверял состояние двигателя, каждый интервал времени по вашему выбору и, если двигателю нужно больше масла, автомобиль Следует прочитать некоторые данные из бака и передать их на двигатель.
Вот простой пример псевдокода, чтобы продемонстрировать, что я имею в виду:
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)
}
}
}