2017-03-02 1 views
5

Wir haben eine Basisklasse, die von 6 öffentlichen Methoden besteht:Wie man Zugang zu selektiven Klassenmethoden in der Vererbung gibt?

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

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

Wir haben zwei Kinder der Klasse B und C, die von A. erbt Wie kann ich es so implementieren, die Klasse B Zugriff hat nur method1(), method2(), method3() und Klasse C hat Zugriff auf method4(), method5(), method6() ??

+5

Sie können nicht, im Grunde. Sie sind öffentliche Methoden - * alles * kann sie aufrufen, ungeachtet der Vererbung. Es klingt wie du willst zwei separate Klassen hier wirklich ... –

+3

dann brauchen Sie zwei Klassen. Klasse 'A1' ist Elternteil von 'B' und' A2' ist Elternteil von 'C' und den beiden 'A1' und' A2' erben Klasse 'A' oder implementieren Schnittstelle' IA' –

+0

Zusammensetzung ist so, wie ich denke, – HopefullyHelpful

Antwort

9

Grundsätzlich können Sie nicht tun. Die Tatsache, dass Sie dies versuchen, sollte als Warnung dienen, dass mit Ihrem Code etwas nicht stimmt.

15

Sie können nicht etwas aus mit öffentlicher Klasse A Methoden verhindern, aber man kann sich auf jeden Fall mit dem richtigen Gebrauch von Schnittstellen verbergen.

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() { } 
} 

So, jetzt haben Sie Klasse B, die nie über A oder über A ‚s Methoden kennen muss. Es kennt nur die IAOne Schnittstelle. B kann nun auch alle Methoden neu bereitstellen (und sogar die Schnittstelle erneut implementieren) und die Implementierung dieser an A delegieren.

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

Aber in diesem Fall werde ich Klasse A nicht richtig benutzen? Das löst den Zweck nicht !!! –

+0

@SryramM Basierend auf was in Ihrer Frage ist es. Wenn es einen Grund gibt, warum das nicht funktioniert, dann war deine Frage schlecht und die Anforderungen nicht richtig dargelegt. – Andrew

+1

Dies ist die richtige Lösung: vernünftige Verwendung von Schnittstellen und Zusammensetzung statt Vererbung. –

0

ich jetzt nicht, warum Sie betonen, haben eine Klasse zu verwenden (A) mit allen 6 Methoden, aber wenn Sie erhalten wollen, dass Sie möglicherweise Aspekt Programmierung Design sollte und setzen und Abfangjäger auf den Kopf Ihrer Methoden . Dann können Sie Anrufer mit MethodCallerInfo und Kontrolle jeweils Ihr Kind Klassen überprüfen nur ihre eigenen Methoden aufrufen

Verwandte Themen