У меня есть два класса, один родительский и один дочерний, которые реализуют типы для определения их ожидаемой функциональности. Это ниже здесь.
export abstract class BaseLogService implements IBaseLogService
{
static $inject: string[] = ['$http']
constructor(private $http:ng.IHttpService){
}
baseMethod1 = (objToLog): void => {
//do stuff
}
baseMethod2 = (objToLog): void => {
//do stuff
}
}
class LocalLogService extends BaseLogService implements ILocalLogService
{
constructor(private $http:ng.IHttpService){
super(this.$http);
}
localMethod1 = (): void => {
//do stuff
}
}
export interface IBaseLogService {
baseMethod1(objToLog):void;
baseMethod2(objToLog):void;
}
export interface ILocalLogService extends IBaseLogService{
localMethod1(): void;
}
Приложение использует службу регистрации и регистрирует вещи для разных компаний. Для компании A это может регистрировать некоторые разные вещи по сравнению с компаниями B и C. Именно поэтому в каждой компании есть служба локальных журналов. Но есть универсальные вещи, которые регистрируются во всех компаниях. Вот почему существует общий класс Log, который расширяют локальные реализации.
Со всем этим введением в сторону мой вопрос состоит в том, как мне надлежащим образом использовать методы моего родительского класса?
Чтобы расширить это, позвольте мне объяснить, как все это используется. Это angularjs, поэтому в контроллере в другом месте приложения есть вызов API POST.
При возвращении обещания этого вызова в .then () необходимо выполнить baseMethod1 для регистрации некоторых общих вещей. Так что это будет что-то вроде псевдокода ниже
myThingToAdd: any;
static $inject: string[] = ['localLogService']
constructor(private localLogService: ILocalLogService){}
this.myPOSTApi.addAThing(this.myThingToAdd)
.then((POSTResponse) => {
this.localLogService.baseMethod1(POSTResponse);
});
Вот тут и возникает мое замешательство. У меня есть кое-что специфическое для компании, которое должно произойти, когда вызывается baseMethod1. Но так как мой вызов службы идет прямо к родительскому классу из контроллера, я перепрыгиваю через локальную дочернюю службу, где должна происходить моя локальная логика.
Я мог бы настроить его так, чтобы мой вызов службы .then () передавался в мой локальный дочерний класс, который выполняет специфическую для моей компании логику перед вызовом super.baseMethod1 (), но это кажется очень косвенным, учитывая, что я могу вызвать метод родительского класса прямо из моего внедренного сервиса в контроллере.
Тогда я подумал, что мог бы сделать два звонка, один для локальной логики, один для общего, каждый выходящий в их соответствующие службы, но это не кажется мне оптимизированным. И кажется, что он побеждает цель наследования.
Затем я спустился в кроличью нору, думая о том, где я сейчас нахожусь.
Должны ли мои родительские методы класса быть невидимыми для остальной части приложения и использоваться только внутри моего дочернего класса? Если да, то насколько глубоко должно быть запутывание? Если мой дочерний класс имеет открытые методы, они вызывают super.baseMethod1 () прямо как
localMethod1 = () => {
//local logic
super.BaseMethod1();
}
Или это даже слишком прямо? Должен ли я иметь публично представленный дочерний метод, который затем вызывает закрытый внутренний метод, который вызывает мой супер метод? Как
localMethod1 = () => {
//local logic
this.callSuperMethod1();
}
private callSuperMethod1 = () => {
super.baseMethod1();
}
Я думаю, что я серьезно переосмысливаю идеи наследования и инкапсуляции, и был бы признателен за некоторые советы о том, как действовать и найти баланс между прагматичными правильными практиками и эффективным / оптимизированным кодом.