Я пытаюсь заключить вызовы службы в объект, созданный этой же службой.Моя цель - использовать полиморфизм, поэтому в компоненте, когда я вызываю метод accept()
или refuse()
моих унаследованных классов Request
, он вызывает соответствующий метод моего сервиса на основе типа подкласса Request
.Для этого я подумал, что мог бы создать экземпляры этих Request
объектов из этого сервиса и передать ссылку на себя на экземпляры объектов, используя аргументы их конструктора, но это не работает.
Проблема, с которой я столкнулся, заключается в том, что когда я вызываю refuse()
или accept()
во время выполнения для этих объектов, созданных таким образом, ссылка на службу не содержит методы службы.
Мой сервис заполняет список Request
объектами подклассов, которые он создает с данными и ссылкой на себя, например:
@Injectable()
export class RequestServiceMock extends RequestService {
....
mapRequestData(requestData: IRequest[]): Request[]{
if(!this.requests)
this.requests = [];
else
this.requests.splice(0, this.requests.length);
if ( requestData ) {
requestData.forEach(( r: IRequest ) => {
switch ( r.type ) {
case Request.TYPE_CONTACT:
this.requests.push( new ContactRequest( r, this ) );
break;
case Request.TYPE_INFORMATION:
this.requests.push( new InformationRequest( r, this ) );
break;
case Request.TYPE_RESOURCE:
this.requests.push( new ResourceRequest( r, this ) );
break;
case Request.TYPE_TRANSACTION_ACKNOWLEDGEMENT:
this.requests.push( new TransactionAcknowlegmentRequest( r, this ) );
break;
}
} );
return this.requests;
}
}
....
acceptResourceRequest( request: ResourceRequest ): Observable<any> {
...
}
refuseResourceRequest( request: ResourceRequest ): Observable<any> {
...
}
respondInformationRequest( request: InformationRequest ): Observable<any> {
...
}
rejectInformationRequest( request: InformationRequest ): Observable<any> {
...
}
...
}
A Request
подкласс выглядит следующим образом:
export class ResourceRequest extends Request {
resourceRef: string;
responseText: string;
constructor(request: IRequest, requestService: RequestService) {
super(request, requestService);
if(request) {
this.resourceRef = request.resourceRef;
this.responseText = request.responseText;
}
}
accept(): Observable<any> {
return this.requestService.acceptResourceRequest(this);
}
reject(): Observable<any> {
return this.requestService.refuseResourceRequest(this);
}
}
Мои вопросы:
- Есть ли способ заставить этот дизайн с полиморфизмом работать под углом, и если да, то как?
- Если я не могу использоватьКаков наилучший способ справиться с хорошим сервисным вызовом в зависимости от типа запроса?