通过构造函数在子类中设置父类的属性

时间:2019-08-07 09:55:13

标签: inheritance typescript2.0

我有以下父类。

df = df.withColumn('Result', F.concat(F.lit('$'),(F.round(F.col('difference'),2)).cast('string')))
df.select('Price', 'Budget', 'Result').show()

+-----+------+------+
|Price|Budget|Result|
+-----+------+------+
|$41.5| $32.7|  $8.8|
|$43.5| $32.7| $10.8|
|$44.5| $32.7| $11.8|
+-----+------+------+

父类包含一个元素,该元素存在于所有子实现中。但是在每个子实现中,我如何获取此元素的方式都不同。也许我正试图解决这个本来的错误。

以下是子类的示例:

class SomeType {}

abstract class Parent {
    protected element : SomeType;

    protected constructor() {
        this.element = this.getElement();
    }

    public abstract getElement() : SomeType;
}

重点是: 在设置class Child extends Parent{ public constructor( protected readonly selector : string ) { super(); } public getElement() : SomeType { return someMagicalGetter(this.selector); } } 之前会调用super()。但是我需要this.selector方法中this.selector的值。

问题:是否有更好的方法来解决此问题? (我猜有,但是那怎么办?)

1 个答案:

答案 0 :(得分:0)

我想出了一个可能的解决方案:

abstract class Parent {
    protected element : SomeType;

    protected constructor(selector : string) {
        this.element = this.getElement(selector);
    }

    public abstract getElement(selector) : SomeType;
}

class Child extends Parent{
    public constructor(
        protected readonly selector : string
    ) {
        super(selector);
    }

    public getElement(selector : string) : SomeType {
        return someMagicalGetter(selector);
    }
}

实际上,以上示例针对此用例进行了解决。但实际上,如果孩子有一个以上getElement方法中正在使用的参数,那么这不是一个好的解决方案。

编辑:

我决定使用以下内容:

abstract class Parent {
    protected constructor(protected readonly element : SomeType) { }
}

class Child extends Parent{
    public constructor(
        protected readonly selector : string
    ) {
        super(someMagicalGetter(selector));
    }
}

我有点复杂了。