是否可以在ActionScript 3中更改继承的访问修饰符?

Jos*_*sch 1 actionscript-3

我正在开发一个项目,我从其他类继承的大量类继承自其他类,依此类推.它可能比它应该更复杂,但我是抽象的傻瓜.

无论如何,有时我需要将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)

目前,在这些情况下,我正在做两件事之一:

  1. 覆盖setter不执行任何操作或将其设置为默认值,以便它仍然可以更新/渲染/无论如何
  2. 抛出一个错误,说它在该类中不可用

我做了一些搜索,一切似乎都指向这是不可能的,但我从未发现它明确表示这是不可能的.那么是否可以在继承的属性/函数上更改访问修饰符?

wel*_*rat 7

这是不可能的,它确实不应该,因为它会导致令人困惑和不可预测的类层次结构.对于初学者来说,如果你做了类似的事情,你就会破坏Liskov替换原则:超类应该始终可以被其派生类替换.如果另一个程序员意外地交换类型,更改API将明显地防止 - 并因此可能导致运行时错误和/或莫名其妙的故障.

如果您正在建模的类具有不同的行为,这会使您"隐藏"其他公共API方法,那么您可能不应该使用继承 - 或者可能以不同的方式.根据您的描述,我猜想在层次结构的更大部分中,您应该使用组合而不是继承.