Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从子类中的抽象类扩展嵌套类,并使方法使用嵌套类的新定义_Java_Abstract Class_Nested Class - Fatal编程技术网

Java 从子类中的抽象类扩展嵌套类,并使方法使用嵌套类的新定义

Java 从子类中的抽象类扩展嵌套类,并使方法使用嵌套类的新定义,java,abstract-class,nested-class,Java,Abstract Class,Nested Class,我有一个基础抽象类,里面有一个嵌套类。在其中一个子类中,我需要扩展嵌套类,但是从基类继承的抽象方法需要嵌套类的基类定义(对于返回类型和参数)。如何让他们使用嵌套类的新定义? 另外,非抽象方法(我没有重写)也不能正常工作(在我将它们移动到抽象类之前,它们工作得很好) 我认为最好的方法是声明一个受保护的,可选的抽象工厂方法来创建嵌套的类 大概是这样的: abstract class Base { protected class BaseNested { .... }

我有一个基础抽象类,里面有一个嵌套类。在其中一个子类中,我需要扩展嵌套类,但是从基类继承的抽象方法需要嵌套类的基类定义(对于返回类型和参数)。如何让他们使用嵌套类的新定义? 另外,非抽象方法(我没有重写)也不能正常工作(在我将它们移动到抽象类之前,它们工作得很好)


我认为最好的方法是声明一个
受保护的
,可选的抽象工厂方法来创建
嵌套的

大概是这样的:

abstract class Base {
    protected class BaseNested {
        ....
    }
    protected abstract BaseNested newNested();
}

class Derived extends Base {
    class DerivedNested extends BaseNested {
        ....
    }

    protected BaseNested newNested() {
       return new DerivedNested();
    }
}
然后,当基类需要一个新的
BaseNested
时,它会调用
newNested
,而不是
new DerivedNested()

如果出于某种原因,您需要
Derived
只处理那些方法的
Derived.Nested
,而不是
Base.Nested
(您应该仔细评估该决定),那么您可以使用泛型。根据它所处理的嵌套类的类型键入
Base

abstract class Base<T extends BaseNested> {
    protected abstract T newNested();
    protected abstract T someMethod();
    protected void anotherMethod(T nested) {
        //...
    }
}

class Derived extends Base<DerivedNested> {
    protected DerivedNested newNested() {
       return new DerivedNested();
    }
    //...
}
抽象类基类{
受保护的抽象T newNested();
受保护的抽象T somethod();
受保护的空无热法(T嵌套){
//...
}
}
类派生的扩展基{
受保护的DerivedNested newNested(){
返回新的DerivedNested();
}
//...
}

嗯,我无法让它发挥作用,所以我放弃了整个想法,我将尝试更简单的方法。不过,谢谢你的回答:)
abstract class Base<T extends BaseNested> {
    protected abstract T newNested();
    protected abstract T someMethod();
    protected void anotherMethod(T nested) {
        //...
    }
}

class Derived extends Base<DerivedNested> {
    protected DerivedNested newNested() {
       return new DerivedNested();
    }
    //...
}