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

Typescript 在两个派生类之间共享方法实现,typescript,Typescript,我试图在两个派生类之间共享一个方法的实现: class BaseClass() { abstract method1(); } class OtherClass extends BaseClass() { method1() {...}; } class MyClass extends BaseClass() { method1 = OtherClass.prototype.method1; // TSC error } 但指示的行给出了错误 类“BaseClass

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

class BaseClass() {
    abstract method1();
}

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

class MyClass extends BaseClass() {
    method1 = OtherClass.prototype.method1; // TSC error
}
但指示的行给出了错误

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

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

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

有没有更好的方法来实现这一点?

没有直接的方法来共享方法,但您可以编写以下内容以避免无操作实现:

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

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

如果您不想在
BaseClass
中使用
method1
,因为您有第四个类需要继承
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 {}
现在
B
C
使用
AnotherBase
共享
method1
的实现,但是
A
有自己的实现

假设以后您希望
MyClass.method1
在执行
OtherClass.method1

MyClass.method1
的实现中,调用
OtherClass.method1
并不像在我的示例中那样容易/漂亮

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


“如果两个类需要具有相同的实现,那么它们需要继承一个包含该实现的基类”——完全错误;这就是BaseBean反模式的最终结果。在像TS这样缺乏多重继承的语言中更是如此——如何在B和C之间共享一个方法,在C和D之间共享另一个方法?类遗产应该表示可替换组件的层次结构,而不是行为的相似性。@RyanCavanaugh我不同意你的意见:1。相同的实现不同于相同的功能(类与接口),2。Typescript使用mixin确实具有多重继承。在本例中,如果执行
MyClass.prototype.method1=OtherClass.prototype.method1
会把事情搞砸,如果
OtherClass.method1
会调用
this.dosomething
,两个类都实现了此方法。
class B extends AnotherBase {
    method1() {
        console.log("B");
        super.method1();
    }
}