在java的接口中,只有抽象方法和常量,我想问:
当一个类去实现该接口,该继承类又希望有自己
的属性时,那么该继承类需要定义并实现自己的一个
方法才能访问该属性,但是这样好像与接口又没有关系了,
并且该类生成的对象也不能调用子类中的该方法,
请看:
interface Inter1
{
public void dspStr(String str);
}class CInter1 implements Inter1
{
private int num;
public CInter1(int num)
{
this.num=num;
}
public void dspStr(String str)
{
System.out.print(str);
}
public void dsoInt()
{
System.out.print(this.num);
}
}public class Test8 { public static void main(String[] args) {
// TODO 自动生成的方法存根
        Inter1 obj=new CInter1(123);
        obj.dsoInt();  //这个是错误的,只能用 CInter1 obj=new CInter1(123);但是这样又失去多态的特性
        obj.dspStr("hello");
}}
请问:遇到这种继承类希望有自己属性的时候,该怎么办?
有什么比较好的设计模式呢?

解决方案 »

  1.   

    接口的实现跟继承是两个概念
    CInter1是实现了 interface Inter1 这个接口接口的多态是为了可以通过接口类 new 实现接口的对象  来显示,不同实现对象对接口内方法的不同实现
    如果要调用实现接口类  中自己定义的方法,可以把 new 出的对象强制类型转换
      

  2.   

    这种要有自己的属性本身就和使用接口的设计思想矛盾,你的这个例子里面的私有属性是不是就是接口的另一个实现,那为什么不另外写一个类实现呢,如果不是,那 CInter1 obj=new CInter1(123);就不存在失去多态的概念了
      

  3.   

    你先搞明白OOP多态概念,接口或者说超类就只应该做他们自己能做的事,你想用子类特有的属性方法,那你就不要用向上造型把CInter1声明为Inter1
      

  4.   

    不知道这样符不符合你要求
    interface Inter1 {

    public void dspStr();}class CInter1 implements Inter1 {

    private Object str;
    @Override
    public void dspStr() {
    // TODO Auto-generated method stub
    System.out.println(str); }
    public Object getStr() {
    return str;
    }
    public void setStr(Object str) {
    this.str = str;
    }}public class test2 {

    public static void main(String arg0[]) {
    CInter1 obj=new CInter1();
    obj.setStr(123);
    obj.dspStr();
    obj.setStr("abc");
    obj.dspStr();
    }
    }
      

  5.   

    CInter1 obj=new CInter1();
    ==============
    这样好像与接口没有关系了,我本来希望Inter1 obj=new CInter1();
      

  6.   

    Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。
    重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
    所以说就是你调用dspStr才会有多态的概念,因为有重写。
    调用dsoInt,用CInter1 obj=new CInter1(123);这种方式不存在失去多态性,因为不存在重写
      

  7.   

    那么是不是如果子类CInter1有自己的属性,那么就只能CInter1 obj=new CInter1(123)生成对象才可以呢?