2013-03-14 74 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

相关问题