【问题标题】:How to expose base class method/property without changing it?如何在不更改的情况下公开基类方法/属性?
【发布时间】:2021-01-08 20:33:31
【问题描述】:

拥有

export class CrudService<T> {
  constructor(...) {}

  protected index$: Observable<T[]> = ...
  protected delete(id: string) { ... }
  protected update(id: string, obj: T) { ... }
  protected create(obj: T) { ... }
}

具体的类如:

interface Message {
  from: string;
  to: string;
  body: string;
}

export class MessageService extends CrudService<Message> {
  constructor(...) { super(...); stuff() }
  
  public index$ = super.index$;  // Results in null
  public index$; // Results in loss of type information (update: any)
}

如何在不修改实现的情况下以最少的样板简单地公开基本方法?

【问题讨论】:

  • 什么方法?您似乎正在尝试访问一个您从未初始化过的道具 (index$)。
  • 对不起,方法或属性。并初始化private index$: Observable&lt;T[]&gt; = ...
  • 也许你应该在你的基类上使用受保护的访问级别而不是私有的?
  • 谢谢@НиколайГольцев,实际上这就是我正在尝试的,不知道它是如何在问题中成为私人的。修好了。

标签: typescript inheritance typescript-generics


【解决方案1】:

我不完全确定您的意思,但我会尽力回答。 假设你有这个层次结构:

abstract class Base() {
 
   constructor() {}

   someMethod() {
       //boiler plate code
          ...
          ...

       this.abstrMethod();
   }

   abstract abstrMethod();
}

class Concrete extends Base() {
   constructor() { super() }

   abstrMethod() { /*concrete implementation*/ };
}

这里someMethod() 在调用abstrMethod() 之前有自己的实现,Concrete 将实现它。这暴露了Base.someMethod() 的样板,但也使它与abstrMethod() 具有多态性。

【讨论】:

  • 不确定你要在这里做什么,但方法需要保持不变,所以在具体类中不需要做任何其他事情。我正在寻找尽可能少的样板。
  • 父类的公共属性暴露给该类的派生方法。将方法公开,看看是否可行。
  • 为了解释我的答案,我想说明的是,基类中的方法可以有自己的实现,只要调用一个抽象方法,其实现将依赖于具体类.这样做将为派生类中的方法添加专门的功能,而无需更改基类中的任何样板。
  • 重点是只公开选择方法。一个 messageService 可能只提供列表、创建、更新和删除操作,一个 userService 可能只提供列表和创建操作......
猜你喜欢
  • 2023-01-26
  • 2018-01-16
  • 2010-12-24
  • 2020-11-24
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2020-11-06
相关资源
最近更新 更多