oop中的开/关原则
本文关键字:原则 oop | 更新日期: 2023-09-27 18:06:37
我正在从事一个电信项目。我在我的项目中实施了开放/封闭原则。以下是我的课程。
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_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。这是一种好的做法吗?或者我还有其他的方法吗?
创建Video_Service不是问题,但更改BaseServiceClass
是,您将不会遵循原则。
如果您将其抽象,则需要修改从BaseServiceClass
继承的所有其他类。但即使你不使它抽象,它似乎有点毫无意义,因为所有当前的客户端类使用你的BaseServiceClass
不使用任何其他方法,除了你已经有2。
如果你的客户端类需要使用第三种方法,它会更好,如果你做另一个抽象类(只是例如BaseServiceClass2
),将从BaseServiceClass
继承,并在那里添加新的方法,使你的客户端依赖于这个类。从那里扩展你现有的类WebServiceClass
, VoiceSericeClass
,你必须创建新的类,从BaseServiceClass2
继承和使用适配器模式。
示例代码:
public abstract class BaseServiceClass
{
public abstract IEnumerable<string> GetServiceData();
public abstract IEnumerable<string> GetDashBoardData();
}
public abstract class BaseServiceClass2 : BaseServiceClass
{
public abstract IEnumerable<string> GetNewTypeOfData();
}
public class WebServiceClass2 : BaseServiceClass2
{
private BaseServiceClass adaptee;
WebServiceClass2(BaseServiceClass adaptee)
{
this.adaptee = adaptee;
}
public override IEnumerable<string> GetDashBoardData()
{
return adaptee.GetDashBoardData();
}
public override IEnumerable<string> GetNewTypeOfData()
{
return Enumerable.Empty<string>();
}
public override IEnumerable<string> GetServiceData()
{
return adaptee.GetServiceData();
}
}
如果你让BaseServiceClass
成为一个接口,如果你需要添加任何新的东西,你只需创建一个从它继承的新接口,就像在前面的例子中一样,让你的客户端类依赖于你的新接口,从那里你可以创建一个继承WebServiceClass
, VoiceSericeClass
等的新类,并实现新的接口。
的例子:
public interface IBaseServiceClass
{
IEnumerable<string> GetServiceData();
IEnumerable<string> GetDashBoardData();
}
public interface IBaseServiceClass2 : IBaseServiceClass
{
IEnumerable<string> GetNewTypeOfData();
}
public class WebServiceClass2 : WebServiceClass, IBaseServiceClass2
{
public IEnumerable<string> GetNewTypeOfData()
{
return Enumerable.Empty<string>();
}
}
public class WebServiceClass : IBaseServiceClass
{
public IEnumerable<string> GetServiceData()
{
List<string> MyList = new List<string>();
return MyList;
}
public IEnumerable<string> GetDashBoardData()
{
List<string> MyList = new List<string>();
return MyList;
}
}
类/接口名只用作占位符,最好以更有意义的方式命名。