2016-03-06 68 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