正如问题所述,我想知道如何在其他类可以访问的类中创建函数,但子类不能。我有一个类有一些公共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
}
}
我知道这可能与自定义命名空间有关,但在搜索完它们之后我仍然不太了解它们的工作方式。就是这样;谢谢你的阅读。
答案 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(即public
,internal
和protected
)。
尽管如此,这可能就是你所追求的。这是一个使用公共命名空间而没有包的示例:
// 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
)