我正在尝试在两个派生类之间共享方法的实现:
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;
有更好的方法吗?
答案 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 {}
现在B
和C
使用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();
}
}