Я работаю над проектом связи. В моем проекте я реализовал принцип Open/Closed. Ниже приведены мои занятия.Принцип Open/Close в OOPS
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 ??
Просьба предложить.
P.S. Мне нужно реализовать этот метод во всех производных классов, т.е. 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. Является ли это хорошей практикой или у меня есть альтернативный способ?
Вы говорите, что хотите добавить новый метод и реализацию, которые появятся на всех классах? – Turbot
Да, я хочу добавить новый метод в класс MainService, а позже я переопределю его в производных классах. – KiddoDeveloper
Вы будете нарушать OCP, когда вам придется изменить существующий класс при добавлении новой функции. Таким образом, вы не следуете за OCP; вы нарушаете его. – Steven