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);
}
}
我正在做一个需要用界面替换具体 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);
}
}