2016-05-31 65 views
1

比方說,我有一個抽象類,延伸類和接口是這樣的:如何引用既擴展又實現的實例?

public abstract class SuperClass { 
    ... 
    public void foo() {...} 
    ... 
} 

public class SubClass extends SuperClass implements MyInterface {...} 

public interface MyInterface { 
    public void bar(); 
} 

注意,我父類實現MyInterface的幾個子類,但不是所有的人。 還讓我們說,我有這樣一個構造另一個類:

public class AnotherClass { 
    private SuperClass sc; 
    public AnotherClass(SuperClass superclass) { 
     sc = superclass; 
    } 
    ... 
} 

我現在的問題是,我如何能夠保證在構造函數中給定的目標也實現MyInterface的?我需要對象sc才能運行兩種方法foo()bar()。我怎樣才能做到這一點?

+0

通過鑄造它。 – SomeJavaGuy

+0

使SuperClass實現你的接口 – ACV

+0

定義它爲'SubClass'沒有意義,因爲我需要實現'MyInterface'的所有子類來適應構造函數。我可以給一個嘗試雖然... – StrikeAgainst

回答

3

您可以介紹其他類的層次結構:

public class NonImplementingSubClass extends SuperClass {...} 

public class ImplementingSubClass extends SuperClass implements MyInterface {...} 

你的所有子類都應該實現你的接口,然後將通過它定義爲'SubClass`或延長ImplementingSubClass

public class SubClass extends ImplementingSubClass {...} 

public class AnotherClass { 
    private ImplementingSubClass sc; 
    public AnotherClass(ImplementingSubClass superclass) { 
     sc = superclass; 
    } 
    ... 
} 
+0

這是一個絕妙的主意!謝謝 :) – StrikeAgainst

3

您可以使用generics與路口的類型,

public class AnotherClass<T extends SuperClass & MyInterface> { 
private T sc; 
public AnotherClass(T superclass) { 
    sc = superclass; 
} 
void fn(){ 
// use both methods 
sc.foo(); 
sc.bar(); 
} 
... 
} 

現在,AnotherClass將只允許那些SuperClass和實施MyInterface類型。

+0

我喜歡這個,但使類通用似乎不幸。怎麼樣,而不是有一個字段'''T'''有2個字段,一個「SuperClass'類型和'''MyInterface''類型之一,並且只存儲兩次引用? –

+0

@JornVernee爲什麼不幸?我不明白爲什麼仿製藥可能會造成任何傷害 –

+0

不是一個壞主意,但我想一旦我需要將對象返回到不同的類並從那裏訪問方法,它會變得有點麻煩... – StrikeAgainst

0
public abstract class SuperClass implements MyInterface { 
    ... 
    public void foo() {...} 
    ... 
} 

public class SubClass extends SuperClass{} 

public interface MyInterface { 
    public void bar(); 
}