如果我有一个类,我想通过重写一个如果它的方法自定义,我唯一能做的就是使用继承(子类和重写方法)?是否有可能以某种方式使用组合来实现相同的目标?重写时使用组合重写继承
1
A
回答
4
是的,您可以使用委派。 Bar
不包含Foo
,而是包含Foo
并代表它在它选择的位置。
interface SomeMethods {
void doSomething();
void doSomethingElse();
}
class Foo implements SomeMethod {
public void doSomething() { // implementation }
public void doSomethingElse() { // implementation }
}
class Bar implements SomeMethod {
private final Foo foo = new Foo();
public void doSomething() { foo.doSomething(); }
public void doSomethingElse() { // do something else! }
}
3
使用组合而不是继承是一种设计选择。
要么你的课程设计时考虑了继承(即它提供了非最终的公共和受保护的方法,打算被子类覆盖),或者设计时考虑到了作文或委派(通过使用策略模式,例如)。
如果该类尚未设计用于定制,您可能可以使用继承来定制它,但不能使用组合/委派机制。
3
当然。您可以使用以下模式。
方法方法简单重写
模板方法模式
class Base {
public void foo() {
// do something
bar();
// do something
}
protected abstract void bar();
}
class Child {
protected void bar() {
// do something.
}
}
代表团
class Base {
private Runnable r;
protected Base(Runnable r) {
this.r = r;
}
public void foo() {
r.run();
}
}
class Child extends Base {
Child() {
super(new Runnable() { /* implementation */})
}
}
相关问题
- 1. 使用继承时的CSS重写
- 2. 重写和继承
- 3. 重写给定的类使用组合而不是继承
- 4. 用重写模仿多重继承
- 5. C++继承,基函数重写时
- 6. 从继承类重写方法
- 7. C++继承和函数重写
- 8. 如何重写样式继承?
- 9. 重写在域类继承的字段
- 10. 在MSBuild中重写继承的任务
- 11. 重写变量Java继承的说明
- 12. C++重写继承的静态常量
- 13. C++编写,从多重继承类
- 14. Java继承和方法重写程序
- 15. 重写和继承的帮助
- 16. 重写继承泛型方法
- 17. C#:继承,重写和隐藏
- 18. 使用集合重写数组
- 19. 重写组合框事件
- 20. 模型继承 - 如何使用重写的方法?
- 21. 使用toString重写和继承来打印arraylist?
- 22. 重写成员时违反了继承安全规则:'Autofac.Integration.WebApi.AutofacWebApiDependencyResolver.BeginScope()'
- 23. WebMarkupMin重写成员时违反了继承安全规则
- 24. 使用mod重写apache重写路径
- 25. PyQt写继承QWidget
- 26. 质量重写承诺
- 27. .htaccess重写合并
- 28. 用于继承/重写的数据库设计模式
- 29. 重写Shape属性后,继承的TShape.Paint不起作用
- 30. 继承的重写方法未被调用
好了,超类必须实现相同的接口,子类? –
这是正确的。 –