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
sDoSomething
内部成员BigCarRepository
,但他不想继承CarRepository
如果你想调用CarRepository
内部成员,那么你必须继承内部成员BigCarRepository
接口强制