2016-03-06 71 views
0

正如问题所述,我想知道如何在其他类可以访问的类中创建函数,但子类不能。我有一个类有一些公共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

你不能,如果你有任何类访问除子类以外的方法,你描述了什么。如果一种方法具有公共访问权限(而内部是公共访问的一种形式),那么任何语言都不可能做到这一点,那么公共访问不能被任何其他类别拒绝,我应该添加完全不相关的甚至尝试实现。如果该方法对子类没有影响,那么让它不起作用,只要这些方法不能被覆盖,为什么你会关心这么多。 – BotMaster

+0

@BotMaster对于OP来说很清楚,使用'internal' *会限制对同一个包中的子类*的访问,而不同包中的子类将不能*访问。我确定这就是你的意思。 – Aaron

+0

这还远远不符合法案,并且效果不会影响只有所有类别的子类。同一包中的所有类和子类都将具有访问权限,所有类和子类之外的包都将无法访问,这是非常不同的。由于这些方法对子类没有影响,因此将它们标记为最终应该就足够了。 – BotMaster

回答

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,这可能是一个很好的选择,让你的代码的意图更加清晰,但它实际上并没有限制访问以任何新的方式,它只是要求访问更加慎重:虽然确实将的API的可见性隐藏给任何不使用该名称空间的人,但任何人都可以使用该名称空间并有权访问API广告(即public,internalprotected)。

不过,这可能是你所有的。下面是它采用了公共空间和无包装的例子:

// 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

+0

啊我明白了。你能否扩大一点; “故意”是什么意思? – NotAPro

+0

@NotAPro我之前在手机上。我刚刚编辑了我的答案,详细阐述了我的意思是“故意”,并提供了示例。 – Aaron