2013-02-19 34 views
1

獲取功能都說我是個抽象類A和抽象類B:從兩類

abstract class A { 
    public void doA(){ 
     //some stuff 
    } 
} 

abstract class B{ 
    public void doB(){ 
     //some stuff 
    } 
} 

現在我要完成以下情況:C

類有只是A功能
D具有功能只是B
E具有的功能AB

我該怎麼做?在java中甚至可能,因爲不能擴展多個類?

+1

我會使用具有所有方法的包裝和使用,B' A'的''實例在幕後,就像一個'Facade'類。事實上,它很大程度上取決於您分析問題的要求,並查看是否存在爲其提供解決方案的[GoF模式](http://en.wikipedia.org/wiki/Design_Patterns)。 – 2013-02-19 19:42:23

+0

是的,我同意Luiggi Mendoza。棘手的部分是你需要多態嗎,e.q. A =新E()?然後,你將會使A和B成爲接口或實現接口。 – kofemann 2013-02-19 19:46:58

回答

2

Java不支持多繼承。如果你想從A和B中獲得功能,你必須至少聲明其中一個爲接口。

爲了獲得A的功能,例如。

public class C extends A { 
    //your methods 
} 

正如其他人所說的那樣,你Facade模式有兩類

假設A和B的功能不是抽象的,因爲你不能實例化抽象類。

public class Facade { 
    private A mA = new A(); 
    private B mB = new B(); 

    private void doB() { 
     mB.doB(); 
    } 

    private void doA() { 
     mA.doA(); // as long as these are visible 
    }  
} 
+0

你也可以使用委託或組合。但這需要額外的工作,並且不會與受保護的/虛擬成員進行良好的交互。 – Antimony 2013-02-19 19:40:53

+0

但是將其中的一個聲明爲接口意味着我無法在我的方法中提供實際的功能,對吧? – nhaarman 2013-02-19 19:41:30

+0

@尼克,這是正確的。 – 2013-02-19 19:42:13

1

這是多態現象。你應該使用接口和適配器模式來實現這一點。 Mkae確定你的doB()doA()是抽象類中的最終方法。

interface IA { 
    public void doA(); 
} 

interface IB { 
    public void doB();} 
} 

abstract class A implements IA { 
    public final void doA() { ... } 
} 

abtstract class B implements IB { 
    public final void doB() { ... } 
} 

class C extends A { 
} 

class D extends B { 
} 

class E implements IA, IB { 
    IA a = new C(); 
    IB b = new D(); 
    public void doA() { a.doA(); } 
    public void doB() { b.doB(); } 
} 
+0

小心,A和B是抽象的。 – 2013-02-19 19:48:01

+0

@SotiriosDelimanolis你是對的。無法初始化它們。 :P – Shivam 2013-02-19 19:49:14

+0

這與其他答案几乎是一樣的例子= \ – 2013-02-19 19:49:25

1

這與其他答案非常相似,但不同之處在於它不嘗試實例化抽象類。

三個類似的答案都是使用Composition來解決問題。人們稱之爲門面,另一個適配器。我稱之爲代理。我不確定哪個(如果有的話)是正確的。三者中的重要事實是我們使用組合而不是繼承。

從創建接口開始。 例如:

public interface iA 
{ 
    public void doA(); 
} 

public interface iB 
{ 
    public void doB(); 
} 

改變你的抽象類來實現這些接口

abstract class A implements iA 
{ 
    public void doA() 
    { 
    ... blah ... 
    } 
} 

abstract class B implements iB 
{ 
    public void doB() 
    { 
    ... blah ... 
    } 
} 

創建A和B(在這裏我做的C本作內部類)的具體版本,實現下,兩個接口,並將C類中的doA()和doB()調用代理到具體的實現中。

public class C implements iA, iB 
{ 
    private ConcreteA cA = new ConcreteA(); 
    private ConcreteB cB = new ConcreteB(); 

    public void doA() 
    { 
    cA.doA(); 
    } 

    public void doB() 
    { 
    cB.doB(); 
    } 


    private class ConcreteA extends A 
    { 
    public doA() 
    { 
     ... blah ... 
    } 
    } 

    private class ConcreteB extends B 
    { 
    public doB() 
    { 
     ... blah ... 
    } 
    } 
1
abstract class A { 
    public void doA(){ 
     // some stuff 
    } 
} 

abstract class B{ 
    public void doB(){ 
     // some stuff 
    } 
} 
class C { 
    private A a; // assume getter/setter methods or constructor for initialization 
    public void doA() 
    { 
     a.doA(); 
    } 
} 
class D { 
    private B b;// assume getter/setter methods or constructor for initialization 
    public void doB(){ 
     b.doB(); 
    } 
} 
class E{ 
    private A a;// assume getter/setter methods or constructor for initialization 
    private B b;// assume getter/setter methods or constructor for initialization 
    public void doAB(){ 
     a.doA(); 
     b.doB(); 
    } 
} 

我建議你多學習抽象類和接口。要了解上述代碼,您需要了解「策略模式」。閱讀「策略模式」後,您將能夠更細緻地修改給定的代碼。我沒有爲接口編寫代碼,因爲它會創建更復雜的東西來理解。

閱讀「策略模式」中的「深入淺出設計模式」