当前位置: 首页 > 知识库问答 >
问题:

如何从父抽象类[duplicate]调用childs类方法

富建章
2023-03-14

大家好,我对java很陌生,还在学习OOP原理。直接回答问题。所以我有一个抽象类和两个继承自它的类。看起来是这样的:

public abstract class A { ... }
public class B extends A { 
    ...
    void methodB() { ... }

public class C extends A {
    ...
    void methodC() { ... }

现在我做到了:

A a = null;
if (that)
    a = new B();
else
    a = new C();

在这一点上,我想做a.methodB();a.methodC();(当然不是两者都做,因为我创建了一个孩子),但我两者都不能做。

共有3个答案

靳茂
2023-03-14

这是您可以做到的:

if (a instanceof B) ((B)a).methodB();
else if (a instanceof C) ((C)a).methodC();

但这是一个反模式,我建议将方法A定义为A抽象中的抽象方法。BC将实现它两者,然后您可以轻松调用a.methodA(),然后将调用方法A的正确实现。

燕智
2023-03-14

如何从父抽象类调用childs类方法

这是不可能的。使用超类型的引用,您只能根据权限改造机制直接访问超类型的成员。但是,您可以强制转换对子类的引用并访问子类的成员。

对其使用instanceof运算符

演示:

abstract class SomeA {
    abstract void commonMethod();
}

class SomeB extends SomeA {
    void methodB() {
        System.out.println("methodB()");
    }

    @Override
    public void commonMethod() {
        System.out.println("SomeB's implementation of commonMethod()");
    }
}

class SomeC extends SomeA {
    void methodC() {
        System.out.println("methodC()");
    }

    @Override
    public void commonMethod() {
        System.out.println("SomeC's implementation of commonMethod()");
    }
}

public class Testing {
    public static void main(String[] args) {
        SomeB bb = new SomeB();
        bb.commonMethod();
        bb.methodB();

        SomeC cc = new SomeC();
        cc.commonMethod();
        cc.methodC();

        SomeA b = new SomeB();
        SomeA c = new SomeC();
        System.out.println(b instanceof SomeB);
        System.out.println(c instanceof SomeB);
        System.out.println(b instanceof SomeC);
        System.out.println(c instanceof SomeC);

        b.commonMethod();
        // b.methodB();//Error as b is a reference of super type
        ((SomeB) b).commonMethod();// Fine after casting the super type reference to SomeB

        c.commonMethod();
        // c.methodC();//Error as c is a reference of super type
        ((SomeC) c).commonMethod();// Fine after casting the super type reference to SomeC
    }
}

输出:

SomeB's implementation of commonMethod()
methodB()
SomeC's implementation of commonMethod()
methodC()
true
false
false
true
SomeB's implementation of commonMethod()
SomeB's implementation of commonMethod()
SomeC's implementation of commonMethod()
SomeC's implementation of commonMethod()
张瀚漠
2023-03-14

你违反了OOPS的概念。因为父类不需要知道子类的行为。你可以做的是在A类中创建一个抽象方法,然后调用方法A。某物()。只需在B和C类中覆盖它的某物方法,并给出相同的实现,您可以在方法B和方法C中给出相同的实现。

public abstract class A { abstract something(); }

public  class B { overide something(){} }

public  class C { overide something(){} }

A a = null;
if (that)
  a = new B();
else
  a = new C();

if that is true then it equivalent to B.something() else C.something(). You can read more about method overriding/runtime polymorphism.  
 类似资料:
  • 问题内容: 我有以下课程 这只是我实际架构的简化版本。最初,我不知道需要创建的人员类型,因此处理这些对象创建的函数将常规对象作为参数。 现在,我想使用此父类对象访问子类的方法。我还需要不时访问父类方法,所以 我不能 使其 抽象 。 我想我在上面的示例中简化太多了,所以这是实际的结构。 if语句显示“无法为QuestionOption找到getMultiple”。OuestionOption具有更多

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 问题内容: 我想在自己的类中调用抽象类的方法。抽象类是: 我想调用上面的方法,并且调用的类是: 每当我尝试运行上述类时,它都会在line上引发NullPointerException 。谁能告诉我如何解决这个问题? 问题答案: 首先,一个抽象类,因此您不能直接实例化它。您必须创建一个子类,比如说它覆盖Call中的任何抽象方法。 获得一个意味着您作为参数传入的任何内容都尚未初始化。因此,在创建Cal

  • 问题内容: 在Python中创建简单的对象层次结构时,我希望能够从派生类中调用父类的方法。在Perl和Java中,有一个用于此的关键字()。在Perl中,我可以这样做: 在Python中,似乎必须从子代中明确命名父类。在上面的示例中,我将不得不执行。 这似乎不正确,因为这种行为使创建深层次结构变得困难。如果孩子们需要知道哪个类定义了一个继承的方法,那么就会造成各种各样的信息痛苦。 这是python

  • 这是一个与实现相关的问题,或者我可能想多了。假设我有一个子类继承了父类。根据我的理解,它将继承父类的方法定义,而不是构造函数。我们需要通过超级方法调用提供或编译器将提供构造函数。我们这样做的原因是,如果没有父类对象实例,我们从子类中的父类获得的方法定义将不存在。 这是否意味着,当我调用父类对象定义的方法(该方法尚未在子类中重写)时,将在父对象实例的子类内部调用?我在想,由于子类会调用父类构造函数并

  • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。