2016-05-31 57 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(); 
}