2011-10-24 67 views
3

我有一个关于接口和类实现接口的问题。Java类接口类

这是我的代码:

interface iMyInterface { 
    public iMethod1(); 
} 

public class cMyClass implements iMyInterface { 
    public iMethod1() { 
     // some code 
    } 
    protected iMethod2() { 
     // some code 
    } 
} 

我想创建,因为这iMyInterface一个实例:

iMyInterface i = new cMyClass(); 
i.iMethod1(); 

这没关系,但我怎么能叫iMethod2()从我的接口实例?这是工作和安全:

((cMyClass)i).iMethod2(); 

感谢您的帮助。

回答

7

是的,这将工作(如果你改变cMyClass申报实施iMyInterface),它是安全的,只要参考真的确实指的cMyClass一个实例。

但是,这通常是一个坏主意。使用接口的全部要点是能够与的任何实现一起工作 - 它将抽象与实现分开。如果你需要一个特定的实现,你可以使i只是cMyClass开始。

因此,假设而不是自己调用cMyClass构造,您会收到iMyInterface类型的方法参数 - 这是一个坏主意,转换为cMyClass在这一点上,因为它可能是一个不同接口的实现。

(在一个单独的说明,这是一个好主意,开始下面的Java命名约定,其中规定的类和接口应帕斯卡尔 - 装箱 - 所以沟ci前缀)

+1

我认为,如果他要演员,他应该用'instanceof'核实剧组,以确保安全。 –

+0

@ S.L.Barth:无论如何,除非所需的失败模式是ClassCastException,当然,在这种情况下,无条件转换就可以。 –

+0

@Jon Skeet谢谢,我现在在界面中使用它,包括Method2。对不起,我忘了在我的示例中添加** implements iMyInterface **。 – TheFrancisOne

0

它将工作(前提是cMyClass实现了iMyInterface,并且您处于保护修饰符的范围内),但这不是正确的OO处理。

如果你想使用iMethod2考虑:

  • 将它添加到界面
  • 创建一个包含方法
  • 使用另一个接口cMyClass myClass = new cMyClass();
+0

谢谢,我在我的界面中添加Method2。 – TheFrancisOne

0

有一些其他的替代投接口到一个类。这里是例子。

interface iMyInterface { 
    void iMethod1(); 
} 

public class cMyClass implements iMyInterface { 

private iMyInterface myInterface; 

public cMyClass() { 
    myInterface = this; 
} 

public void iMethod1(){ 
    System.out.println("Print from cMyClass iMethod1()"); 
} 

protected void iMethod2() { 
    System.out.println("Print from cMyClass iMethod2()"); 
} 

/** 
* Getter so we can access to the interface methods. 
* @return 
*/ 
public iMyInterface getMyInterface() { 
    return myInterface; 
} 
} 

为了从您的界面获取值,下面是代码示例。

public class Main { 
public static void main(String[] args) { 

    cMyClass myClass = new cMyClass(); 
    myClass.getMyInterface().iMethod1(); 
    myClass.iMethod2(); 
} 
} 

输出:

从cMyClass iMethod1()从cMyClass iMethod2()

我觉得这是一个很好的例子,如何可以从类代码分开接口代码

列印。只需创建接口的实例,并通过具有该接口的getter使用每个方法。