Mat*_*lde 3 oop protected typescript
我正在将代码从 PHP 移植到 NodeJs(Typescript)。\n我遇到了以下 PHP 代码(简化)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0
\n\n<?php\nclass A {\n protected function protectedData() {\n return \'accessible\';\n }\n}\nclass B extends A {\n public function extractTest($anInstanceOfA) {\n return $anInstanceOfA->protectedData();\n }\n}\n$instanceA = new A();\n$instanceB = new B();\necho $instanceB->extractTest($instanceA);\nRun Code Online (Sandbox Code Playgroud)\n\n在沙箱中运行它会产生“可访问”的回显。
\n\n我在 Typescript 中编写了相同的代码,但这似乎不起作用......
\n\nclass A {\n protected protectedData(): string {\n return \'accessible\';\n }\n}\n\nclass B extends A {\n public extractTest(anInstanceOfA: A): string {\n return anInstanceOfA.protectedData();\n }\n}\n\nconst instanceA = new A();\nconst instanceB = new B();\n\n\nconsole.log(instanceB.extractTest(instanceA));\nRun Code Online (Sandbox Code Playgroud)\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0
\n\n\n\n\n错误:属性“protectedData”受保护,只能通过类“B”的实例访问。(2446)\n \xc2\xa0
\n
有没有办法在 Typescript 中实现这一点,或者 PHP 和 Typescript 中的受保护方法之间有很大区别吗?
\n来自文档:
\n\n\n\n\nprotected 修饰符的作用与 private 修饰符非常相似,不同之处在于声明为 protected 的成员也可以在派生类中访问。
\n
在上面的情况下,您使用protectedData函数参数的 as 方法anInstanceOfA,该参数恰好是基本类型A。但是你不能在派生类protectedData 中B访问by this.protectedData(),所以 TS 在这里大喊大叫。什么有效,什么无效:
class B extends A {\n public extractTest(anInstanceOfA: A, instanceOfB: B): string {\n anInstanceOfA.protectedData() // \xe2\x9c\x96, protected member of arg with base class \n instanceOfB.protectedData() // \xe2\x9c\x94, protected member of arg with *same* class \n this.protectedData(); // \xe2\x9c\x94, (derived) protected member via `this`\n return anInstanceOfA["protectedData"]() // escape-hatch with dynamic property access\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,您可以声明protectedData为public或使用转义舱口,这将使protected成员可以通过带有括号表示法的动态属性访问来访问。
anInstanceOfA["protectedData"]()\nRun Code Online (Sandbox Code Playgroud)\n\n\n
| 归档时间: |
|
| 查看次数: |
5318 次 |
| 最近记录: |