Javascript TypeScript在派生类中隐藏受保护的类方法
我有这样的类层次结构:Javascript TypeScript在派生类中隐藏受保护的类方法,javascript,typescript,class,inheritance,encapsulation,Javascript,Typescript,Class,Inheritance,Encapsulation,我有这样的类层次结构: abstract class Base { private b: string; abstract protected x() {} abstract pub(): void; } class D1 extends Base { private d: number; protected x() { ... } pub() {} } 我需要向API使用者公开一个派生类: class D2 extends D1 { } 。。。但我不希望D2的用户
abstract class Base {
private b: string;
abstract protected x() {}
abstract pub(): void;
}
class D1 extends Base {
private d: number;
protected x() { ... }
pub() {}
}
我需要向API使用者公开一个派生类:
class D2 extends D1 {
}
。。。但我不希望
D2
的用户使用其超类的受保护/私有成员(意外或故意)。但是,D2
必须具有访问公共超类成员的权限。是否可以隐藏内部(通过符号或其他方式?)同时仍使D1的(新D2())实例通过检查?我可以更改任何私有/受保护的内部构件,但公共API需要保持不变。“我不希望D2的用户使用其超类的受保护/私有成员”。。。这正是受保护/私有的目的。你是说你不希望D2本身能够使用这些方法吗?是的,我被迫使用继承层次结构,但我不希望D2的用户践踏方法或重新定义它们。这并没有让我真正明白什么是“D2的用户”?你是说写X类扩展D2
的人还是写newd2()
的人?用户会写D2类扩展D1{}
(还有许多其他扩展D1
)。我希望它们的派生类是D1的实例,但不能破坏D1和Base的受保护成员。例如,classx扩展了D1{X(){return 5;}
clobbersD1.X
insideX
如果客户端没有使用TS,除了true(#foo
)之外,您可能无法做很多事情来防止它们恶意地戳内部,尽管符号可能有助于防止意外的clobbering(虽然根据我的经验,在TypeScript中更难使用)。当代码编译为JS时,任何私有的/受保护的/公共的注释都会被删除。