2017-03-02 33 views
5

我们有一个基类,下设6种公有方法:如何在继承中提供对选择性类方法的访问?

public class A 
{ 
public void method1() 
{ 
    // Implementation 
} 

public void method2() 
{ 
    // Implementation 
} 
. 
. 
. 
. 
public void method6() 
{ 
    // Implementation 
} 
} 

我们有两个子类B和C从A继承了我如何能实现其在B级访问这样的方式只有method1(),method2(),method3()和Class C有权访问method4(),method5(),method6()?

+5

你基本上不能。它们是公共方法 - 任何*都可以调用它们,而不考虑继承。这听起来像你可能真的想在这里两个单独的类... –

+3

那么你需要两个类。 “A1”类是“B”的父类,“A2”是“C”的父类,“A1”和“A2”都继承类“A”或实现接口“IA” –

+0

组成是我想去的方式 – HopefullyHelpful

回答

9

你基本上不能这样做。你试图这样做的事实应该是警告你的代码有问题。

15

您不能阻止某些东西使用公共类A方法,但您可以通过正确使用接口来隐藏它们。

interface IAOne 
{ 
    void method1(); 
    void method2(); 
    void method3(); 
} 

interface IATwo 
{ 
    void method4(); 
    void method5(); 
    void method6(); 
} 

class A : IAOne, IATwo 
{ 
    void method1() { } 
    void method2() { } 
    void method3() { } 
    void method4() { } 
    void method5() { } 
    void method6() { } 
} 

所以,现在你有B类永远需要了解A或约A的方法。它只知道IAOne接口。 B现在可以重新公开任何方法(甚至重新实现接口)并将这些实现委托给A

class B : IAOne 
{ 
    private IAOne _a; 
    public B(IAOne a) { _a = a; } 

    void method1() { _a.method1(); } 
    void method2() { _a.method2(); } 
    void method3() { _a.method3(); } 
} 
+0

但是在这种情况下,我不会使用A类吧?所以这不能解决目的! –

+0

@SriramM基于你的问题是什么。如果有一个原因,这不起作用,那么你的问题是不好的,并没有正确地布置要求。 – Andrew

+1

这是正确的解决方案:明智地使用接口和组合而不是继承。 – 2017-03-02 15:00:19

0

我不知道现在为什么你强调使用一个类(A)与所有6种方法,但如果你想获得可能令您应方面的程序设计,并把与拦截器上的你的方法头。然后你可以使用MethodCallerInfo来检查调用者并控制你的每个子类只需调用他们自己的方法