如何创建一个不被子类继承的公共方法?

时间:2016-03-06 02:37:44

标签: actionscript-3 scope

正如问题所述,我想知道如何在其他类可以访问的类中创建函数,但子类不能。我有一个类有一些公共getter和setter,我希望我的文档类可以访问调用,但我不希望子类具有这些函数,因为它们在子类上是无用的。

例如

public class SomeClass
{
    public function SomeClass() {}
    public function notInherited():void { trace("Not inherited"; }
}

public class OtherClass extends SomeClass 
{
     public function OtherClass() 
     {
     notInherited(); //Want this to return an error
     } 
}

public class HasAccess 
{
     public function HasAccess() 
     {
     notInherited(); //Not inherited
     }
}

我知道这可能与自定义命名空间有关,但在搜索完它们之后我仍然不太了解它们的工作方式。就是这样;谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

根据您提出的一般条款,您无法做到这一点,但如果您将文档类和其他类放在同一个包中并使用internal代替,则可以执行此操作public,并将您的子类放在不同的包中。 internal关键字限制了对同一包中类的访问。

示例(注意package语句):

package main {
    public class Main extends MovieClip {
        public function Main() {
            var stuff:Stuff = new Stuff();
            stuff.doStuff();
        }
    }
}

package main {
    public class Stuff {
        internal function doStuff():void { }
    }
}

package other {
    public class OtherStuff extends Stuff {
        public function OtherStuff() {
            // no access to this.doStuff()
        }
    }
}

对于using a namespace,这可以是一个很好的选择,可以使代码的意图更加清晰,但它实际上并没有以任何新的方式限制访问,它只需要访问更加深思熟虑:namespace 隐藏API的可见性给任何不使用命名空间的人,任何人都可以使用命名空间并且可以访问没有任何额外限制的API(即publicinternalprotected)。

尽管如此,这可能就是你所追求的。这是一个使用公共命名空间而没有包的示例:

// my_stuff.as
package {
    public namespace my_stuff;
}

// Stuff.as
package {
    public class Stuff {
        my_stuff function doStuff():void { }
    }
}

// Main.as
package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        public function Main() {
            use namespace my_stuff; // you can put this above the class to give the entire class access to the namespace
            var stuff:Stuff = new Stuff();
            stuff.doStuff();
        }
    }
}

// OtherStuff.as
package {
    public class OtherStuff extends Stuff {
        public function OtherStuff() {
            this.doStuff(); // not allowed

            this.my_stuff::doStuff(); // allowed

            // also allowed
            use namespace my_stuff;
            this.doStuff();
        }
    }
}

(请注意,如果您的命名空间位于包中,则为package stuff { public namespace my_stuff },您必须像类一样导入命名空间,例如:import stuff.my_stuff