2014-04-28 101 views
1

我有以下類在C++C++模板和繼承在Java中

ParentClass 
{ 
    virtual int MyMethod(); 
} 

class ExistingOne : ParentClass {...} 

class ExistingTwo : ParentClass {...} 

現在我想創建一個類,可以擴展這些已存在的類並覆蓋了幾個他們的方法加上調用方法在某些條件下的現有班級中。

在C++中,這是使用做了以下:

template< class BaseTemplate > 
class MyClass : public BaseTemplate 
{ 
    int MyMethod() 
    { 
    DoSomething(); 
    return BaseTemplate::MyMethod(); 
    } 
} 

這是如何在Java中做了什麼?

到目前爲止,我有

public abstract class ParentClass 
{ 
    public abstract int MyMethod(); 
} 

public class ExistingOne extends ParentClass {...} 

public class ExistingTwo extends ParentClass {...} 

public class MyClass<T extends ParentClass> 
{ 
    public int MyMethod() 
    { 
    DoSomething(); 
    return T.MyMethod(); //MyMethod must be statically defined? 
    } 
} 

哦,最後,我不能修改「現有」或父類。

那麼這是正確的方法?我如何解決靜態要求?

+2

與C++ AFAIR相比,Java對於_'generic'_類和接口的能力差。 –

+0

@πάνταῥεῖ這不是關於*可憐的capabilites *,這只是錯誤的設計。 –

+0

@LuiggiMendoza這只是一個意見。這可能是真的,你說什麼...... –

回答

2

在C++類定義中,MyClass擴展了BaseTemplate。在Java示例中,MyClass未擴展ParentClass,從而導致預期問題。

在Java中,只是改變的定義:

public class MyClass<T extends ParentClass> extends ParentClass { 
    @Override 
    public int MyMethod() { 
     DoSomething(); 
     return super.MyMethod(); 
    } 
} 

由於MyMethodParentClass抽象的,這一點讓編譯器錯誤。相反,您需要從ParentClass的實例中調用MyMethod。這可以通過固定具有場T tMyClass

public class MyClass<T extends ParentClass> extends ParentClass { 
    T t; 
    public MyClass(T t) { 
     this.t = t; 
    } 
    @Override 
    public int MyMethod() { 
     DoSomething(); 
     return t.MyMethod(); 
    } 
} 

否則,使用泛型這裏延伸ParentClass不會有任何意義。

+0

謝謝你的快速回答。然而,調用super.MyMethod()的問題是無法直接調用ParentClass類型的抽象方法MyMethod()。除此之外,在C++中,調用的方法將是模板不是父級的方法。 – user3581890

+0

你在正確的軌道上,但是如果你在上面使用他的ParenClass定義,這有一些錯誤...考慮拋光? – jgitter

+0

@ user3581890答案已更新。 –