两个派生类之间的共享方法实现

时间:2016-07-16 00:36:00

标签: typescript

我正在尝试在两个派生类之间共享方法的实现:

class BaseClass() {
    abstract method1();
}

class OtherClass extends BaseClass() {
    method1() {...};
}

class MyClass extends BaseClass() {
    method1 = OtherClass.prototype.method1; // TSC error
}

但指示的行给出错误

  

Class'BaseClass'定义实例成员函数'method1',但扩展类'MyClass'将其定义为实例成员属性。

一种令人烦恼的解决方法是包含一个无操作的实现并将方法重新分配给原型:

class MyClass extends BaseClass () {
    method1() { /*noop*/ };
}
MyClass.prototype.method1 = OtherClass.prototype.method1;

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

没有直接的方式来共享方法,但你可以写这个以避免无操作实现:

class MyClass {
}
interface MyClass {
    method1(): void;
}
MyClass.prototype.method1 = OtherClass.prototype.method1;

答案 1 :(得分:-1)

如果两个类都需要具有相同的实现,那么它们需要继承一个包含该实现的基类,这就是它在OO中的处理方式。

如果您不想在method1中拥有BaseClass,因为您有第四个类需要继承BaseClass并且需要具有method的不同实现与其他两个类相比,你需要另一个继承级别:

abstract class BaseClass {
    abstract method1();
}

class A {
    method1() { console.log("A"); }
}

class AnotherBase extends BaseClass {
    method1() { console.log("AnotherBase"); }
}

class B extends AnotherBase {}

class C extends AnotherBase {}

现在BC使用method1分享AnotherBase的实施,但A拥有自己的实施。

让我们说,以后您将要MyClass.method1在执行OtherClass.method1之前/之后做一些事情? 在MyClass.method1的实施中,您在调用OtherClass.method1时不会像在我的示例中那样容易/漂亮。

MyClass.prototype.method1 = function() {
    console.log("MyClass");
    OtherClass.prototype.method1();
}

VS

class B extends AnotherBase {
    method1() {
        console.log("B");
        super.method1();
    }
}