相关疑难解决方法(0)

如何强制派生类调用超级方法?(就像Android一样)

我想知道,在创建新Activity类然后重写onCreate()方法时,在eclipse中我总是自动添加:super.onCreate().这是怎么发生的?抽象或父类中是否有一个强制执行此操作的java关键字?

我不知道调用超类是否违法,但我记得在某些方法中我因为没有这样做而抛出异常.这也是内置到java中的吗?你可以使用一些关键字来做到这一点吗?或者它是如何完成的?

java android overriding super

76
推荐指数
5
解决办法
4万
查看次数

需要覆盖方法才能调用super

我希望当子类重写父类中的方法时,super.method()会在该子方法中调用它.

有没有办法在编译时检查这个?
如果没有,当发生这种情况时,我将如何抛出运行时异常?

java super

29
推荐指数
2
解决办法
9904
查看次数

强制基本方法调用

Java或C#中是否有强制继承类来调用基础实现的构造?你可以调用super()或base()但是如果没有调用它可能会抛出编译时错误吗?那会很方便..

- 编辑 -

我主要是对重写方法感到好奇.

c# java polymorphism inheritance super

24
推荐指数
4
解决办法
2万
查看次数

Java通用构建器

假设我需要一些DerivedBuilder扩展一些BaseBuilder.基础构建器有一些方法foo(返回BaseBuilder).派生构建器有方法bar.方法bar应方法之后被调用foo.为了做到这一点,我可以像这样覆盖foo方法DerivedBuilder:

@Override
public DerivedBuilder foo() {
    super.foo();
    return this;
}
Run Code Online (Sandbox Code Playgroud)

问题是BaseBuilder有很多方法foo,我必须覆盖它们中的每一个.我不想这样做,所以我尝试使用泛型:

public class BaseBuilder<T extends BaseBuilder> {
    ...

    public T foo() {
        ...
        return (T)this;
    }
}

public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
    public T bar() {
        ...
        return (T)this;
    }
}
Run Code Online (Sandbox Code Playgroud)

但问题是我还是不能写

new DerivedBuilder<DerivedBuilder>()
        .foo()
        .bar()
Run Code Online (Sandbox Code Playgroud)

即使T这是DerivedBuilder.为了不覆盖很多功能,我该怎么办?

java generics builder-pattern

9
推荐指数
2
解决办法
2824
查看次数

如何强制派生类在多层上调用超类方法?

我正在尝试找到一种最优雅的方式来允许孩子和父母对祖父母发起的事件做出反应。这是一个天真的解决方案:

abstract class A {
    final public void foo() {
        // Some stuff here
        onFoo();
    }

    protected abstract void onFoo();
}

abstract class B extends A {
    @Override
    final protected void onFoo() {
        // More stuff here
        onOnFoo();
    }

    protected abstract void onOnFoo();
}

class C extends B {
    @Override
    protected void onOnFoo() {
        // Even more stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上,我正在尝试找到一种最佳方法,以便在调用foo()时允许所有相关类执行某些逻辑。为了稳定和简单起见,我希望所有步骤都按顺序完成,尽管这不是必需的。

我发现的另一种解决方案涉及将所有事件处理程序存储为某种形式的Runnable:

abstract class A {
    private ArrayList<Runnable> fooHandlers = new ArrayList<>();

    final public void foo() {
        // Some …
Run Code Online (Sandbox Code Playgroud)

java design-patterns

9
推荐指数
1
解决办法
103
查看次数

很明显,一个覆盖方法应该调用super的好方法?

这个问题只是让我感到困惑,在重写方法时很容易忘记调用super().

在我的情况下,我正在重构一些现有的东西,其中已经有大约十个类覆盖了一个方法.直到昨天,该方法都有一个空的默认实现,所以如果子类称为super,则无关紧要.你可以在任何有价值的IDE中找到覆盖物,但是你知道它是怎么回事,电话铃声,同事们背后都有一个小小的东西......很容易忘记检查一个地方或者忽略它.理想情况下,@ Override注释会有一个对应物,如果基类方法被注释但是覆盖不会调用super,编译器会为这些位置生成警告.

什么是我能做的最好的事情?

java overriding annotations super

2
推荐指数
1
解决办法
1054
查看次数