C# 接口中重写方法的替代方法

Alternate way for override method in Interface in C#

我正在做一个需要用界面替换具体 class 的项目。下面是具体的class及其继承class

public class CarRepository 
{
    private string _model;
    private string _colour;

    public CarRepository(string model, string colour) {
        _model = model;
        _colour = colour
    }

    public string Get(GUID id)
    {
        return id.ToString();
    }

    protected virtual void DoSomething(ref ISpecial special) {
        special = special.AddFields(Rego, ModelNumber)
    }
}

public class BigCarRepository : CarRepository 
{
    public class BigCarRepository(string model, string colour) 
    : base(model, colour)

    protected override void DoSomething(ref ISpecial special) {
        special = special.AddFields(SpecialOffer, OptionPack)
    }
}

我想用接口(即 ICarRepository)从 CarRepository 替换 BigCarRepository 的具体 class 的继承。因此我创建了一个接口并替换了具体的 class 但找不到解决覆盖方法的方法。我在下面创建了接口并修改了我的具体 classes 和继承,但停留在覆盖方法上。

public interface ICarRepository 
{
     string Get(string id);
}

public class CarRepository : ICarRepository
{
    private string _model;
    private string _colour;

    public CarRepository(string model, string colour) {
        _model = model;
        _colour = colour
    }

    public string Get(GUID id)
    {
        return id.ToString();
    }

    protected virtual void DoSomething(ref ISpecial special) {
        special = special.AddFields(Rego, ModelNumber)
    }
}

public class BigCarRepository : ICarRepository 
{
    public ICarRepository _carRepository { get; set; }

    public BigCarRepository(ICarRepository carRepository) 
    {
        _carRepository = carRepository;
    }

    public string Get (string id) 
    {
        return _carRepository.Get(id);
    }

    **protected override void DoSomething(ref ISpecial special) {
        special = special.AddFields(SpecialOffer, OptionPack)
    }**
}

更新:

如果需要对CarRepository进行抽象。您通过提取接口做得很好。您还需要添加您希望派生 classes 实现的所有方法。

        public interface ICarRepository 
        {
             string Get(string id);
             void DoSomething(ref ISpecial special);
        }

 public class BigCarRepository : ICarRepository 
        {
            public ICarRepository _carRepository { get; set; }

            public BigCarRepository(ICarRepository carRepository) 
            {
                _carRepository = carRepository;
            }

            public string Get (string id) 
            {
                return _carRepository.Get(id);
            }

            public void DoSomething(ref ISpecial special) {

                special = special.AddFields(SpecialOffer, OptionPack);
            }
        }

如果这是你想要的,那没问题。

在我之前的回答中,我建议您可能需要重用 base class CarRepository 的一些逻辑,但仍然想强制 BigCarRepository 实现他自己的 DoSomething 逻辑。如果您在派生 classes.

中重复使用相同的代码,这可能很有用
    public abstract class CarRepository : ICarRepository
    {
        private string _model;
        private string _colour;

        protected CarRepository(string model, string colour) {
            _model = model;
            _colour = colour
        }

        public string Get(GUID id)
        {
            return id.ToString();
        }

        public absctract void DoSomething(ref ISpecial special); // Force all derived classes to implement this method

       protected virtual void DoSomethingBase(ref ISpecial special) {
            special = special.AddFields(Rego, ModelNumber)
        }
    }

public class BigCarRepository : CarRepository 
{
    public ICarRepository _carRepository { get; set; }

    public BigCarRepository(ICarRepository carRepository) : base (pass_the_model, pass_the_colour)
    {
        _carRepository = carRepository;
    }

    public override void DoSomething(ref ISpecial special) {
        DoSomethingBase(ref special); // if you need some base class logic
        special = special.AddFields(SpecialOffer, OptionPack);
    }
}