Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 是否有一个相当于;密封的;或;“最后的”;打字稿?_Inheritance_Typescript_Final_Typescript2.0_Sealed - Fatal编程技术网

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()

不,在撰写本文时没有。有一个关于这样一个关键词的提议仍在考虑之中,但可能会实施,也可能永远不会实施

见:

  • ,及

将“sealed method”作为函数类型的只读属性的实现黑客示例,在尝试在扩展类中重写时引发编译器错误:

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)