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

C# C中接口中重写方法的替代方法#,c#,inheritance,interface,overriding,base,C#,Inheritance,Interface,Overriding,Base,我正在做一个需要用接口替换具体类的项目。下面是具体类及其继承类 public class CarRepository { private string _model; private string _colour; public CarRepository(string model, string colour) { _model = model; _colour = colour } public string Ge

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

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
)替换
BigCarRepository
CarRepository
继承的具体类。因此,我创建了一个接口并替换了具体的类,但找不到解决重写方法的方法。我已经创建了下面的接口,并修改了我的具体类和继承,但仍然停留在覆盖方法上

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进行抽象。通过提取接口,您做得很好。您还需要添加希望派生类实现的所有方法

        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);
            }
        }
如果这是你想要的,你很好

在我之前的回答中,我建议您可能需要重用基类CarRepository的一些逻辑,但仍然希望强制BigCarRepository实现自己的DoSomething逻辑。如果在派生类中重用相同的代码,那么这可能会很有用

    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);
    }
}

我在BigCarRepository中得到一个“没有合适的方法可以重写”错误我在BigCarRepository中得到一个“没有合适的方法可以重写”错误。我认为CarRepository也应该改为抽象类。否则,抽象DoSomething方法将在非抽象类中出现抽象方法错误是的,您是对的。携带物应该是抽象的。但BigCarRepository应该从中衍生出来。我已经编辑了我的答案。我认为您只需要并且想要实现接口。我已经更新了我的答案accordingly@Yves以色列,,我认为@vins想要实现
CarRepository
s
DoSomething
内部成员
BigCarRepository
,但他不想继承
CarRepository
如果你想调用
CarRepository
内部成员,那么你必须继承
内部成员
BigCarRepository
接口强制