我正在开发一个项目,我从其他类继承的大量类继承自其他类,依此类推.它可能比它应该更复杂,但我是抽象的傻瓜.
无论如何,有时我需要将getter/setter从公共更改为私有.我想这不是一个需要,而是希望切断子类中预设的东西,但仍需要在父类中公开访问.
所以一个例子是:
Class Base {
public function set label( value:String ):void{};
}
Class A extends Base {}
Class B extends A {
public function B() {
super();
this.label = "stuff";
}
override public function set label( value:String ):void {
//this setter should not be publicly available since the label should not be possible to change in this class
}
}
Run Code Online (Sandbox Code Playgroud)
目前,在这些情况下,我正在做两件事之一:
我做了一些搜索,一切似乎都指向这是不可能的,但我从未发现它明确表示这是不可能的.那么是否可以在继承的属性/函数上更改访问修饰符?
这是不可能的,它确实不应该,因为它会导致令人困惑和不可预测的类层次结构.对于初学者来说,如果你做了类似的事情,你就会破坏Liskov替换原则:超类应该始终可以被其派生类替换.如果另一个程序员意外地交换类型,更改API将明显地防止 - 并因此可能导致运行时错误和/或莫名其妙的故障.
如果您正在建模的类具有不同的行为,这会使您"隐藏"其他公共API方法,那么您可能不应该使用继承 - 或者可能以不同的方式.根据您的描述,我猜想在层次结构的更大部分中,您应该使用组合而不是继承.