【问题标题】:OOPS implementationOOPS 实施
【发布时间】:2026-01-24 23:55:02
【问题描述】:

我有 CarsmartEngineturboEngine 类。 smartEngineturboEngine 类都有 start() 方法。您将如何实现它,以便将来可以根据需要对其进行增强。还要求编写完整的代码和有关代码的问题。

【问题讨论】:

  • 要记住的重要一点是,一辆汽车的后备箱可以搭载多个发动机

标签: c# oop


【解决方案1】:

我会创建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 作为类名和方法名。

【讨论】:

    【解决方案2】:

    您可以创建interface IEngine,可用于 Car 类(或其他地方,引擎实现的细节没有意义)。

    您还可以创建抽象 BaseEngine 类(当然,它实现了 IEngine)。这个基类封装了通用引擎逻辑,消除了代码重复。许多不同的引擎(如 SmartEngineTurboEngine)可以使用 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);
        }
    }
    

    【讨论】: