【发布时间】:2021-05-13 15:14:20
【问题描述】:
如果这个问题太令人困惑,我很抱歉,我会尽量简单。
TLDR;如何在 Typescript 基类中调用必须在子类中定义的子类的私有方法?
我有许多不同的 Typescript 子类,它们需要不同的代码来执行相同的操作:写入文件。
90% 的基本代码是相同的,每个子类都有一些方法的具体实现。
所以我采用了相同的代码并将其放在一个基类中,但它调用了一个必须在子类上实现的方法,并且最好是私有的。
这是一个例子:
abstract class BaseClass {
constructor() { }
SetOptions() {
// Set the options
// Return the options
}
GetOptions() {
// Get the options
this.WriteStuff();
}
private WriteStuff(arg1: Item, arg2: number) {}
}
class SubClass1 extends BaseClass {
private WriteStuff(arg1: SubClass1Item, number: number) {
// Write stuff in the SubClass1 way
}
}
class SubClass2 extends BaseClass {
private WriteStuff(arg1: SubClass2Item, number: number) {
// Write stuff the SubClass2 way
}
}
SubClass1Item 和 SubClass2Item 实现了 Item 接口。
所有子类对 SetOptions 和 GetOptions 使用相同的代码,但 WriteStuff 在每个子类中都有个性化的代码,并且需要是私有的,所以它不会被其他开发人员意外调用。
Typescript 说我不能这样做,因为“类型具有私有属性 'WriteStuff' 的单独声明”。并且 Typescript 不会让我不在 BaseClass 中声明该方法,因为那时我正在调用一个不存在但将存在于子类中的方法。
这可能吗?
【问题讨论】:
-
方法不应该是私有的,应该是抽象的。 (或受保护的摘要)
-
这本质上与
private方法的想法不兼容。它必须是protected(或public)才能让父母/孩子访问它。 -
您可能还需要将其设为通用以支持不同类型的
Item。 -
如前所述:如果您需要 any 外部代码来使用它,无论是“任何代码”、“同一包中的某些代码”还是“超类中的某些代码”根据定义,代码不是私有的。就基于类的 OO 而言,孩子们知道他们的超类的方法,但反过来却不知道(也不应该)。调用
this.functionName()将始终运行实例函数,如果有的话,或者沿着类链向上直到找到一个,然后运行它。
标签: javascript typescript inheritance subclass private-members