2013-03-14 72 views
3

抽象基類有可能只有某些派生類可以訪問某些抽象方法的抽象方法嗎?我想要做的是限制可能的方法能夠從不同的繼承類中調用。這裏是我的問題的一個例子:派生類的抽象方法限制控制

public abstract Foo 
{ 
    ... 
    public abstract void fooMethod1(int num1); 
    public abstract void fooMethod2(int num2); 
} 

public Bar1 extends Foo // This class shouldn't be able to access fooMethod2() 
{ 
    ... 
    @Override 
    public void fooMethod1(int num1) 
    { 
     System.out.println((num1 * 5)); 
    } 
} 

public Bar2 extends Foo // This class has no restrictions 
{ 
    ... 
    @Override 
    public void fooMethod1(int num1) 
    { 
      System.out.println((num1 * 10)); 
    } 

    @Override 
    public void fooMethod2(int num2) 
    { 
      System.out.println((num2 * 5)); 
    } 
+0

除私有變量外,如果子類擴展超類,則子類將可以訪問所有超類成員。 – Abi 2013-03-14 07:58:53

+0

可能'fooMethod2'方法不屬於'Foo'。 – 2013-03-14 08:00:54

+0

你爲什麼想這樣做? – 2013-03-14 08:01:58

回答

3

所有的公共抽象方法都必須在每個子類中重寫。 喲能做什麼:

  1. 拆分Foo抽象類兩大類:BaseFooExtendedFoo其中ExtendedFoo應該延伸BaseFoo,所以Bar1擴展BaseFooBar2延伸ExtendedFoo
  2. 重寫不需要的方法來拋出UnsupportedOperationException,所以如果調用這個方法,它會拋出一個(有意義的)異常。

我會用第一種方法。

0

有可能通過將BAR2在同一個包和BAR1在不同的包裝和製作方法分別包保護和公衆做。或者你可以創建一個註釋並生成代碼來通過反射蠻力檢查調用者。

+0

你的意思是「覆蓋」與「訪問」?如果你這樣做,這是不可能的,通過正常的方法。因爲它要麼是最終的要麼不是。你可以做一些反射魔術,這樣你就可以使原始方法成爲「final」,然後只有在當前類是特定類時才調用可重寫方法,但這是令人討厭的。 – 2013-03-14 08:01:37

0

你不能,超級類中的所有公共抽象方法對子類都是可見的。 除此之外,所有子類都必須實現所有抽象方法。

爲了您的需要,我建議在Foo和Bar1之間建立另一個類,在其中實現所需的方法。

2

這就是這樣。但是,這可能不是你真正想要的。這取決於你的真實需求。

public abstract class Foo 
{ 

} 

public abstract class FooMeth1 extends Foo { 
    public abstract void fooMethod1(int num1); 

} 

public abstract class FooMeth2 extends FooMeth1 { 
    public abstract void fooMethod2(int num2); 
} 

public class Bar1 extends FooMeth1 // This class shouldn't be able to access fooMethod2() 
{ 
    @Override 
    public void fooMethod1(int num1) 
    { 
     System.out.println((num1 * 5)); 
    } 
} 

public class Bar2 extends FooMeth2 // This class has no restrictions 
{ 
    @Override 
    public void fooMethod1(int num1) 
    { 
      System.out.println((num1 * 10)); 
    } 

    @Override 
    public void fooMethod2(int num2) 
    { 
      System.out.println((num2 * 5)); 
    } 
} 
0

要增加我自己的兩分錢,我會說,而不是使用超級類,你做兩個接口。即Foo1Foo2。每個界面將包含其中一種方法。那麼你可以分別使用Bar1Bar2分別執行Foo1Foo2。這種方法的好處是你可以有一個實現Both接口的類Bar3,而對於Abstract類,你只能擴展一個超類。

0

如果Foo類只包含抽象方法,則可以在2個接口中分離Foo類,然後實現bar1和bar2中需要的接口。或者將bar1中只需要的方法拆分到接口中,然後將其餘的部分拆分爲foo

相關問題