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

在超类中使用subclass方法

丌官浩旷
2023-03-14

我有一个类(为简单起见称为子类),它扩展了SuperClass并实现了IClass。我知道您可以通过使用super.method()调用SuperClass的方法,但是是否可以从SubClass调用它从IClass实现的方法?

例子:

public class SuperClass {

    public void method(){

        implementedMethod();

    }

}

子类:

public class SubClass extends SuperClass implements IClass{

    public void implementedMethod() {

        System.out.println("Hello World");

    }

}

IClass:

public interface IClass {

    public void implementedMethod();

}

我想从超类调用子类'implementedMethod()(它从IClass获得)

我该怎么做呢?

共有3个答案

岳俊雅
2023-03-14

调用该方法的唯一方法是创建SubClass类型的对象(在超类中)并调用subClassInstance。implementedMethod()。

我还想强调这是非常不优雅的。正如在对你的问题的评论中所说,如果你的超类需要调用子类方法,你应该重新考虑你的类设计。

堵毅然
2023-03-14

鉴于上述类型,anExpressionofTypeSubclassicClass。必须使用implementedMethod()。请注意,表达式的类型(它提供的视图)必须具有要使用的方法。在这种情况下,这里不能使用超类类型的表达式,因为它没有声明的implementedMethod成员。

一种方法——可以说是首选方法——是使用抽象方法。尽管抽象方法不是多态的严格要求,但它们描述了子类应该提供实现的场景。(抽象方法可以用空方法代替,期望——但不需要——在子类中被重写,但为什么不使用抽象来实现它的设计目的呢?)

abstract class SuperClass implements IClass {
    // Don't implement this, but declare it abstract
    // so that we can conform to IClass as well
    public abstract void implementedMethod();

    public void method () {
       // Now this object (which conforms to IClass) has implementedMethod
       // which will be implemented by a concrete subclass.
       implementedMethod();
    }
}

这有一些“负面”方面,超类不能直接实例化(毕竟它是抽象的),而且超类必须实现(或者,如图所示,通过抽象委托出去)预期的签名。在本例中,我还选择让超类实现IClass,尽管它不是严格要求的,因为它保证超类和所有子类都可以被视为IClass。

或者,记住表达式的类型只是对象的视图,不一定与对象的实际具体类型相同。虽然我建议不要使用下面的代码,因为它失去了一些类型安全性,但我认为它显示了重要的一点。

class SuperClass {
    public void method () {
        // We try to cast and NARROW the type to a
        // specific "view". This can fail which is one
        // reason why it's not usually appropriate.
        ((IClass)this).implementedMethod();
    }
}

class SubClass extends SuperClass implements IClass {
  // ..
}

class BrokenSubClass extends SuperClass () {
}

// OK! Although it is the SAME OBJECT, the SuperClass
// method can "view" the current instance (this) as an IClass
// because SubClass implements IClass. This view must be
// explicitly request through a cast because SuperClass itself
// does not implement IClass or have a suitable method to override.
(new SubClass()).method();

// BAD! ClassCastException, BrokenSubClass cannot be "viewed" as IClass!
// But we didn't know until runtime due to lost type-safety.
(new BrokenSubClass()).method();
羊新翰
2023-03-14

您可以将超级类抽象化:

public abstract class SuperClass implements IClass {
    public void method(){
        implementedMethod();
    }
}
 类似资料:
  • 我有一个名为的超级类,我有3个子类,分别是,和。 在每个子类中,我都有私有参数,和。 我想在 类中创建一个名为 的方法,该方法从 中删除 1 并将 10 添加到中,以便我可以在 main 方法中调用它们时将该方法应用于所有子类。但是如何将私有参数从子类获取到超类中呢? 我不能在超类中声明它们,因为每个子类都有自己的默认启动参数,这些参数应该在游戏期间进行。

  • 下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~

  • 问题内容: 我对Java中的多态性有基本的疑问。我已经在一个名为AnimalTestDrive.java的文件中编写了以下代码。根据我的说法,以下代码应专门以粗体显示该行,但不幸的是,它不能。您能否解释为什么,我给出了以下错误: 问题答案: 让我们尝试以与编译器相同的方式查看此行: 首先,它需要弄清楚是什么意思。很好而且很容易-它是当前方法中的局部变量,因此它不需要花很多时间。 该变量的编译时类型

  • 我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是

  • 问题内容: 问题答案: 简单说明:使用时 仅可访问其中定义的公共方法。中定义的方法不是。 使用时 定义的公共方法也可以与公共方法一起访问。 两种情况下创建的对象都是相同的。 例如:

  • 我有一个名为User的抽象类和一个扩展User的子类。User类包含一个方法:受保护的抽象空setId(String newId){}:它在User类中设置一个私有变量id。所以我的问题是,当我去创建setId()方法时,如果User类中的id是私有的,我如何引用它?据我所知,id变量不能被设置为受保护的。感谢任何能帮忙的人!