当子类无法实现接口方法时,您会怎么做,因为超类具有相同签名的final方法?

时间:2013-05-10 15:49:05

标签: java android interface override abstract

假设您有一个extends Activityimplements MyInterface的课程,Activity包含public final void setProgress(int progress)MyInterface包含public abstract void setProgress(int progress)

我需要从界面覆盖该方法,但我不能,因为Activty说它是最终的,不能被覆盖。

我该怎么办?

示例:

public class MyActivity extends Activity implements MyInterface
{
  @Override
  protected void onCreate(Bundle bundle)
  {
    //stuff goes here
  }
  //Cannot override the final method from Activity
  @Override
  public void setProgress(int progress)
  {
  }

}

我们还要扩展这个问题并说你无法访问MyInterface的来源来改变它,在这种情况下你做了什么?

5 个答案:

答案 0 :(得分:3)

使用装饰器设计模式。

这是decorator pattern的简化示例。 (改编自interwebs和polygenelubricants对SO的回答)

注意:在我们开始从界面中删除abstract关键字之前,这是错误的语法

将类层次结构重组为static内部类,以便整个示例包含在一个编译单元(as seen on ideone.com)中:

以下是目标类层次结构的图解概述

Class hierarchy Overview

public class AnimalDecorator {

    static interface Animal {
        public String makeNoise();
            public void wagTail();
            //other methods
    }   
    static class Dog implements Animal {
        public final String makeNoise() { return "woof"; }
        public final void wagTail() { //do wag tail action }
    }
    static class DogDecorator implements Animal {
            //delegate
            private Animal animal;

            public DogDecorator (Animal animal){this.animal = animal;}
        public String makeNoise() { animal.makeNoise();}
            public void wagTail() { animal.wagTail();}

    }

    static class LoudDog extends DogDecorator {
        @Override public String makeNoise() {
            return "WOOF WOOF WOOF!!!";
        }
    }
}

所以这里我们有一个简单的Animal层次结构,带有Dog子类。我们还有DogDecorator装饰器 - 也是Animal - 它只是将所有方法委托给另一个Animal。也就是说,它并没有真正做任何有效的装饰,但它已经准备好进行子类化,以便可以添加实际的装饰。

我们这里只有两种方法,makeNoise()wagTail()。然后我们创建我们想要的类LoudDog并使用它。 (考虑Animal有多种方法的情况;然后Normal最有价值。

请注意,我们甚至可以堆叠一个装饰在另一个装饰之上。确切的实现细节可能会有所不同,但这个简化的示例几乎捕获了装饰器模式的本质。


步骤

  1. 将原始“Component”类子类化为“Decorator”类(参见UML图);
  2. 在Decorator类中,添加一个Component指针作为字段;
  3. 将Component传递给Decorator构造函数以初始化Component指针;
  4. 在Decorator类中,将所有“Component”方法重定向到“Component”指针;和
  5. 在ConcreteDecorator类中,覆盖需要修改其行为的任何Component方法。
  6. 另见

    • Effective Java 2nd Edition,Item 18:首选接口到抽象类

    相关问题

答案 1 :(得分:0)

编辑:

在这种情况下,类不能覆盖最终方法。因此,您的接口将具有与父类完全相同的签名(因此接口通过继承自动实现),或者您创建具有不同名称的方法。

解决方案在很大程度上取决于具体情况,这里没有教科书解决方案。

答案 2 :(得分:0)

您无法覆盖最终方法,因为在Java编程语言中,final关键字用于定义以后无法更改的实体。

表格Java Language Specification

答案 3 :(得分:0)

从未尝试但可以尝试一下。 您也必须在子类中实现MyInterface,并且可以覆盖MyInterface的setProgress方法而不是其超类。

应该说......一个好问题:)

答案 4 :(得分:0)

不要使用MyActivity工具MyInterface而是创建实现它的匿名或内部类。

通过这种方式,您仍然可以访问MyActivity中与setProgress(int)完全分开的所有final Activity.setProgress(int)组件和功能。