我正在尝试在一个超类中实现一个方法,它应该可以在子类中使用,但不能改变。请考虑以下内容:
export abstract class BaseClass {
universalBehavior(): void {
doStuff(); // Do some universal stuff the same way in all sub classes
specializedBehavior(); // Delegate specialized stuff to sub classes
}
protected abstract specializedBehavior(): void;
}我的意图是,BaseClass的任何子类不仅可以自由省略universalBehavior()的实现,甚至不允许提供实现。这在TypeScript中(还)是不可能的吗?当我在我的子类中省略实现时,Intellisense会报错。我能做的最好的事情就是:
export class SubClass extends BaseClass {
universalBehavior(): void {
super.universalBehavior();
}
specializedBehavior(): void {
// sub class' implementation
}
}显然,这是有问题的,因为我必须确保除了对super.universalBehavior()的调用之外,任何子类都不会实现universalBehavior()。
发布于 2017-04-04 01:38:40
不,在写这篇文章的时候还没有。有一个关于这样一个关键字的提议仍在考虑中,但可能会也可能永远不会实现。
请参见:
发布于 2019-02-06 09:51:26
在扩展类中尝试重写时抛出编译器错误的类型函数的只读属性的实现hack示例:
abstract class BaseClass {
protected element: JQuery<HTMLElement>;
constructor(element: JQuery<HTMLElement>) {
this.element = element;
}
readonly public dispose = (): void => {
this.element.remove();
}
}
class MyClass extends BaseClass {
constructor(element: JQuery<HTMLElement>) {
super(element);
}
public dispose(): void { } // Compiler error: "Property 'dispose' in type 'MyClass' is not assignable to the same property in base type 'BaseClass'"
}TypeScript 2.0通过使用私有构造函数来支持“最终”类:
class A {
private constructor(){}
}
class B extends A{} //Cannot extend a class 'A'. Class constructor is marked as private.ts(2675)发布于 2020-04-10 01:34:56
// I use this workaround:
export default class CreateHandler extends BaseHandler {
// final prop used as method
public readonly create = (blueprint: Blueprint): Response<Record> => {
return blueprint.create();
};
// normal method
public store(blueprint: Blueprint): Response<Record> {
return this.response(blueprint.create());
}
}https://stackoverflow.com/questions/42814649
复制相似问题