【问题标题】:Alternate way for override method in Interface in C#C#中接口中覆盖方法的替代方法
【发布时间】:2019-01-09 18:27:22
【问题描述】:

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

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

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 中调用成员,那么你必须从CarRepository 继承BigCarRepository 并强制其接口

标签: c# inheritance interface overriding base


【解决方案1】:

更新:

如果您需要对 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方法会出现abstract-method-in-non-abstract-class的错误
  • 是的,你是对的。 CarRepository 应该是抽象的。但 BigCarRepository 应该从中派生出来。
  • 我已经编辑了我的答案。我认为您只需要并且想要实现该接口。我已经相应地更新了我的答案
  • @Yves Israel ,我认为@vins 想在BigCarRepository 内部实现CarRepositorys DoSomething 成员,但他不想继承CarRepository
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 2013-11-14
  • 2014-10-23
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多