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