Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Class 在构造函数中使用实现的成员(typescript)_Class_Typescript_Abstract - Fatal编程技术网

Class 在构造函数中使用实现的成员(typescript)

Class 在构造函数中使用实现的成员(typescript),class,typescript,abstract,Class,Typescript,Abstract,我发现,在实现一个类时,被实现的成员在构造函数中不可用。我不知道我是否实现了错误,或者我是否真的应该采取不同的方法 abstract class Parent { abstract myVar: number; constructor() { console.log(this.myVar) // Outputs undefined } f() { console.log(this.myVar) // outputs 5 } } class Child e

我发现,在实现一个类时,被实现的成员在构造函数中不可用。我不知道我是否实现了错误,或者我是否真的应该采取不同的方法

abstract class Parent {
  abstract myVar: number;

  constructor() {
    console.log(this.myVar) // Outputs undefined
  }

  f() {
    console.log(this.myVar) // outputs 5
  }
}

class Child extends Parent {
  myVar: number = 5;
}

let myChild = new Child;
myChild.f();
如何访问构造函数中的这些已实现成员?

此:

class Child extends Parent {
    myVar: number = 5;
}
相当于:

class Child extends Parent {
    myVar: number;

    constructor() {
        super();
        this.myVar = 5;
    }
}
因此,首先调用超级构造函数,在其中尝试访问尚未分配的
myVar

这在编译的js中也很清楚:

var Parent = (function () {
    function Parent() {
        console.log(this.myVar);
    }
    Parent.prototype.f = function () {
        console.log(this.myVar);
    };
    return Parent;
}());
var Child = (function (_super) {
    __extends(Child, _super);
    function Child() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.myVar = 5;
        return _this;
    }
    return Child;
}(Parent));
如果您希望能够访问
Parent
构造函数中的
myVar
,您可以执行以下操作:

abstract class Parent {
    abstract myVar: number;

    constructor() {
        this.init();
        console.log(this.myVar);
    }

    f() {
        console.log(this.myVar);
    }

    protected abstract init();
}

class Child extends Parent {
    myVar: number;

    protected init() {
        this.myVar = 5;
    }
}
这:

相当于:

class Child extends Parent {
    myVar: number;

    constructor() {
        super();
        this.myVar = 5;
    }
}
因此,首先调用超级构造函数,在其中尝试访问尚未分配的
myVar

这在编译的js中也很清楚:

var Parent = (function () {
    function Parent() {
        console.log(this.myVar);
    }
    Parent.prototype.f = function () {
        console.log(this.myVar);
    };
    return Parent;
}());
var Child = (function (_super) {
    __extends(Child, _super);
    function Child() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.myVar = 5;
        return _this;
    }
    return Child;
}(Parent));
如果您希望能够访问
Parent
构造函数中的
myVar
,您可以执行以下操作:

abstract class Parent {
    abstract myVar: number;

    constructor() {
        this.init();
        console.log(this.myVar);
    }

    f() {
        console.log(this.myVar);
    }

    protected abstract init();
}

class Child extends Parent {
    myVar: number;

    protected init() {
        this.myVar = 5;
    }
}

基类构造函数在其自身执行期间将无法看到派生类的字段

您可以改为使用此模式:

abstract class Parent {
  constructor(public myVar: number) {
    console.log(this.myVar) // Outputs 5
  }

  f() {
    console.log(this.myVar) // outputs 5
  }
}

class Child extends Parent {
    constructor() {
        super(5);
    }
}

let myChild = new Child;
myChild.f();

基类构造函数在其自身执行期间将无法看到派生类的字段

您可以改为使用此模式:

abstract class Parent {
  constructor(public myVar: number) {
    console.log(this.myVar) // Outputs 5
  }

  f() {
    console.log(this.myVar) // outputs 5
  }
}

class Child extends Parent {
    constructor() {
        super(5);
    }
}

let myChild = new Child;
myChild.f();

不太喜欢从构造函数调用虚拟方法。派生类可能会调用基类方法,因为基类仍处于部分初始化状态,因此基类方法的行为将是未定义的。@RyanCavanaugh在大多数情况下您是对的,但有时很难避免。无论如何,我在这里用它来说明事情发生的顺序。我不太喜欢从构造函数调用虚拟方法。派生类可能会调用基类方法,因为基类仍处于部分初始化状态,因此基类方法的行为将是未定义的。@RyanCavanaugh在大多数情况下您是对的,但有时很难避免。无论如何,我在这里用它来说明事情发生的顺序。