Inheritance 是否有一个相当于;密封的;或;“最后的”;打字稿?
我试图在一个超类中实现一个方法,该方法应该可以在子类中使用,但不能更改。考虑这一点:Inheritance 是否有一个相当于;密封的;或;“最后的”;打字稿?,inheritance,typescript,final,typescript2.0,sealed,Inheritance,Typescript,Final,Typescript2.0,Sealed,我试图在一个超类中实现一个方法,该方法应该可以在子类中使用,但不能更改。考虑这一点: export abstract class BaseClass { universalBehavior(): void { doStuff(); // Do some universal stuff the same way in all sub classes specializedBehavior(); // Delegate specialized stuff to
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;
}
我的意图是,基类的任何子类不仅可以自由省略universalBehavior()
的实现,甚至不允许提供实现。这在TypeScript中(还)不可能吗?当我在子类中忽略实现时,Intellisense会抱怨。我能做的最好的事情似乎是:
export class SubClass extends BaseClass {
universalBehavior(): void {
super.universalBehavior();
}
specializedBehavior(): void {
// sub class' implementation
}
}
显然,这是有问题的,因为我必须确保除了调用
super.universalBehavior()
之外,没有任何子类实现universalBehavior()
不,在撰写本文时没有。有一个关于这样一个关键词的提议仍在考虑之中,但可能会实施,也可能永远不会实施
见:
- ,及
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'"
}
//我使用以下解决方法:
导出默认类CreateHandler扩展BaseHandler{
//用作方法的最终支柱
公共只读创建=(蓝图:蓝图):响应=>{
返回blueprint.create();
};
//常规方法
公共商店(蓝图:蓝图):响应{
返回此.response(blueprint.create());
}
}
下面是关于在TypeScript中添加final
的讨论:@MikeMcCaughan-所以我想没有关键字。也许有人会发布某种解决方法。我见过的使用,将在对象上使用,但这不是一回事(它不允许对类进行任何修改)。在JavaScript中,这个问题通常通过直接在任何子类上调用prototype方法来解决,而不是使用prototype链。一个常见的例子是Object.hasOwnProperty.call(target,“some property”)
来检查属性是否来自对象本身而不是原型链。您可以使用相同的技巧,即使子类是否对该方法进行阴影处理也无关紧要。捕捉得好!甚至不确定这是不是黑客。看起来非常有效,我也很期待。虽然我看不到这里抛出错误的逻辑,因为用JavaScript扩展基本原型根本不会修改它。@weaknespase我认为编译器将Typescript转换为JavaScript的方式已经改变了,因为将上述内容放在Typescript的操场上,错误现在已经消失了类“BaseClass”定义实例成员属性“dispose”,但扩展类“MyClass”将其定义为实例成员函数。“。这意味着它确实很容易绕过-对于“密封方法”来说不是一个可靠的解决方法。这不是一个有效的解决方案。如果子类也使用lambda属性,则TS不会抱怨。但是你不能创建一个新的a()
…因此它与其他语言中的final
类并不完全相同请在发布答案时包含对代码的解释。
class A {
private constructor(){}
}
class B extends A{} //Cannot extend a class 'A'. Class constructor is marked as private.ts(2675)