打字稿:使父类中的 public 方法成为派生 class 中的 private/protected 方法
Typescript: Make public methods in parent become private/protected methods in derived class
我有以下 class 和一些 public
方法:
class A {
public methodOne() {}
public methodTwo() {}
}
我有一个 class 扩展了上面的
class B extends A {}
如何让classA
中的methodOne
和methodTwo
变成private
或protected
在 class B
?
/*--- Expectation ---*/
const a = new A();
const b = new B();
a.methodOne(); //OK
b.methodOne(); //Error!
你不能这样做,设计使然。它会使 B 陷入困境,声称它与 A 兼容(因为它扩展了 A),但也不与 A 兼容(因为它没有与 A 相同的 public 属性) .
下面的函数写起来应该没问题:
function doStuff(param: A) {
param.methodOne();
}
但是子类化的好处之一是多态性。 doStuff 函数不需要担心它传递的是字面意义上的 A 的东西,还是它传递的是从 A 扩展的东西。Typescript 支持这一点,因此会将以下两行视为完全正确(如果B 从 A 延伸):
doStuff(new A())
doStuff(new B())
为此,B 必须具有与 A 相同的所有属性。它可能有更多,但不能更少。
如果你不想拥有与 A 相同的属性,那么我建议不要从它扩展。
我有以下 class 和一些 public
方法:
class A {
public methodOne() {}
public methodTwo() {}
}
我有一个 class 扩展了上面的
class B extends A {}
如何让classA
中的methodOne
和methodTwo
变成private
或protected
在 class B
?
/*--- Expectation ---*/
const a = new A();
const b = new B();
a.methodOne(); //OK
b.methodOne(); //Error!
你不能这样做,设计使然。它会使 B 陷入困境,声称它与 A 兼容(因为它扩展了 A),但也不与 A 兼容(因为它没有与 A 相同的 public 属性) .
下面的函数写起来应该没问题:
function doStuff(param: A) {
param.methodOne();
}
但是子类化的好处之一是多态性。 doStuff 函数不需要担心它传递的是字面意义上的 A 的东西,还是它传递的是从 A 扩展的东西。Typescript 支持这一点,因此会将以下两行视为完全正确(如果B 从 A 延伸):
doStuff(new A())
doStuff(new B())
为此,B 必须具有与 A 相同的所有属性。它可能有更多,但不能更少。
如果你不想拥有与 A 相同的属性,那么我建议不要从它扩展。