假设您有一个extends Activity
和implements 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
的来源来改变它,在这种情况下你做了什么?
答案 0 :(得分:3)
这是decorator pattern的简化示例。 (改编自interwebs和polygenelubricants对SO的回答)
注意:在我们开始从界面中删除abstract关键字之前,这是错误的语法
将类层次结构重组为static
内部类,以便整个示例包含在一个编译单元(as seen on ideone.com)中:
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 :(得分:0)
编辑:
在这种情况下,类不能覆盖最终方法。因此,您的接口将具有与父类完全相同的签名(因此接口通过继承自动实现),或者您创建具有不同名称的方法。
解决方案在很大程度上取决于具体情况,这里没有教科书解决方案。
答案 2 :(得分:0)
您无法覆盖最终方法,因为在Java编程语言中,final关键字用于定义以后无法更改的实体。
答案 3 :(得分:0)
从未尝试但可以尝试一下。 您也必须在子类中实现MyInterface,并且可以覆盖MyInterface的setProgress方法而不是其超类。
应该说......一个好问题:)
答案 4 :(得分:0)
不要使用MyActivity
工具MyInterface
而是创建实现它的匿名或内部类。
通过这种方式,您仍然可以访问MyActivity
中与setProgress(int)
完全分开的所有final Activity.setProgress(int)
组件和功能。