【发布时间】:2016-09-10 05:33:55
【问题描述】:
我正在从事一个电信项目。我在我的项目中实施了开放/封闭原则。以下是我的课程。
MainServiceClass.CS
public abstract class BaseServiceClass
{
public abstract IEnumerable<string> GetServiceData();
public abstract IEnumerable<string> GetDashBoardData();
}
Web_Service.CS
public class WebServiceClass : BaseServiceClass
{
public override IEnumerable<string> GetServiceData()
{
List<string> MyList = new List<string>();
return MyList;
}
public override IEnumerable<string> GetDashBoardData()
{
List<string> MyList = new List<string>();
return MyList;
}
}
Voice_Service.CS
public class VoiceSericeClass : BaseServiceClass
{
public override IEnumerable<string> GetServiceData()
{
List<string> MyList = new List<string>();
return MyList;
}
public override IEnumerable<string> GetDashBoardData()
{
List<string> MyList = new List<string>();
return MyList;
}
}
以后如果需要实现Video服务,我会新建一个Video_Service类,相信会实现Open/Close原理。
如果我需要在 MainServiceClass.cs 添加一个新方法,我将添加一个新方法 (GetNewTypeOfData())。
问题:在这里,我正在修改一个类。不过,我在关注 OCP 吗?或者,有什么方法可以在 MainServiceClass.cs 中添加新方法??
请提出建议。
附注我需要在所有派生类(即 Web_Service.cs、Voice_Service.cs 和 Video_Service.cs)中实现此方法
在 CrudaLilium 回复后更新我的问题。
这是我的理解。如果我错了,请纠正我。
我当前的代码:
public interface IMainBase
{
IEnumerable<string> GetData2016();
}
public class VoiceService : IMainBase
{
public IEnumerable<string> GetData2016()
{
return Enumerable.Empty<string>();
}
}
我会在 2017 年得到一个新的要求。所以,我会在 2017 年更新我的代码
public interface IMainBase
{
IEnumerable<string> GetData2016();
}
public class VoiceService : IMainBase
{
public IEnumerable<string> GetData2016()
{
return Enumerable.Empty<string>();
}
}
//New Code will be Added in 2017....Start
public interface IMainBase2017 : IMainBase
{
IEnumerable<string> GetData2017();
}
public class voiceService2017 : VoiceService, IMainBase2017
{
public IEnumerable<string> GetData2017()
{
return Enumerable.Empty<string>();
}
}
//New Code Added be in 2017...Ended
我会在 2018 年再次收到新的要求。所以,我将在 2018 年更新我的代码。
public interface IMainBase
{
IEnumerable<string> GetData2016();
}
public class VoiceService : IMainBase
{
public IEnumerable<string> GetData2016()
{
return Enumerable.Empty<string>();
}
}
//New Code will be Added in 2017....Start
public interface IMainBase2017 : IMainBase
{
IEnumerable<string> GetData2017();
}
public class voiceService2017 : VoiceService, IMainBase2017
{
public IEnumerable<string> GetData2017()
{
return Enumerable.Empty<string>();
}
}
//New Code Added be in 2017...Ended
//New Code will be Added in 2018...Start
public class WebService2018 : IMainBase2017
{
public IEnumerable<string> GetData2016()
{
return Enumerable.Empty<string>();
}
public IEnumerable<string> GetData2017()
{
return Enumerable.Empty<string>();
}
}
//New Code will be Added in 2018...End
按照上面的代码,我没有违反 OCP。这是一个好习惯还是我也有其他方法?
【问题讨论】:
-
您是说要添加将出现在所有类中的新方法和实现吗?
-
是的,我想在 MainService 类中添加一个新方法,稍后我将在派生类中覆盖它。
-
在添加新功能时必须更改现有类时,您将违反 OCP。所以你没有遵循 OCP;你把它弄坏了。
-
@Steven Fine,我明白了。但是你能告诉我如何在 MainService 类中添加一个新方法吗?我应该创建一个接口还是抽象类?请提出建议。
-
在不破坏 OCP 的情况下,您无法添加新方法。您应该使用新方法创建一个新类。
标签: c# asp.net oop solid-principles design-principles