【发布时间】:2026-01-24 23:55:02
【问题描述】:
我有 Car、smartEngine 和 turboEngine 类。 smartEngine 和 turboEngine 类都有 start() 方法。您将如何实现它,以便将来可以根据需要对其进行增强。还要求编写完整的代码和有关代码的问题。
【问题讨论】:
-
要记住的重要一点是,一辆汽车的后备箱可以搭载多个发动机
我有 Car、smartEngine 和 turboEngine 类。 smartEngine 和 turboEngine 类都有 start() 方法。您将如何实现它,以便将来可以根据需要对其进行增强。还要求编写完整的代码和有关代码的问题。
【问题讨论】:
我会创建IEngine接口:
interface IEngine
{
void Start();
}
并且两个类都必须继承这个接口,然后你可以为这两个类实现Start方法:
public class SmartEngine : IEngine
{
...
public void Start() { Console.WriteLine("SmartEngine"); }
...
}
public class TurboEngine : IEngine
{
...
public void Start() { Console.WriteLine("TurboEngine"); }
...
}
顺便说一句,我不知道您是如何实现Car 类的,但是根据汽车可以搭载的发动机数量,有两种选择。如果它只能携带其中一个,那么您只需要一个具有IEngine 类型的属性。但是,如果它可以携带多个,那么你需要在Car类中声明它们:
public IEngine engine; // Car has an Engine
或
public SmartEngine smartEngine;
public TurboEngine turboEngine;
附带说明一下,关注naming conventions 很重要。始终使用 PascalCasing 作为类名和方法名。
【讨论】:
您可以创建interface IEngine,可用于 Car 类(或其他地方,引擎实现的细节没有意义)。
您还可以创建抽象 BaseEngine 类(当然,它实现了 IEngine)。这个基类封装了通用引擎逻辑,消除了代码重复。许多不同的引擎(如 SmartEngine 和 TurboEngine)可以使用 BaseEngine 作为基类来共享相同的功能。 如果某些引擎的行为完全不同,那么只需使用 iterface 并实现全新的引擎类。
/// <summary>
/// Represents car engine.
/// </summary>
public interface IEngine
{
void Start();
}
/// <summary>
/// Implement base behavior for different engine implementations.
/// For example: Model property can be common for all your engines.
/// </summary>
public abstract class BaseEngine : IEngine
{
protected BaseEngine(string model)
{
if (model == null)
throw new ArgumentNullException();
Model = model;
}
public abstract void Start();
public string Model { get; private set; }
}
/// <summary>
/// Implement smart engine.
/// </summary>
public class SmartEngine : BaseEngine
{
public SmartEngine(string model) : base(model) { }
public override void Start()
{
Console.WriteLine("SmartEngine {0} started.", Model);
}
}
/// <summary>
/// Implement turbo engine.
/// </summary>
public class TurboEngine : BaseEngine
{
public TurboEngine(string model) : base(model) { }
public override void Start()
{
Console.WriteLine("TurboEngine {0} started.", Model);
}
}
【讨论】: