我有一些View子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现两个方法a()和b(),它们都必须运行相同的init()方法,该方法很长,对所有这些方法都做相同的操作。在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性?
如果是C++,我可以从视图和一个在创建时运行init()并具有abstract方法a()和b()的新抽象类中进行多重继承,那么它在Java中是如何实现的?
也许有什么方法可以用某种装饰器来实现它?
如果我理解正确,您可以创建一个抽象类AbstractView
来扩展View
并实现您的通用init()
方法。AbstractView
应该声明抽象方法a()
和b()
,但将实现留给子类。
public abstract class AbstractView extends View {
public void init() {
// common init implementation here
}
public abstract void a();
public abstract void b();
}
由于您正试图将行为添加到一组现有的子类(ImageView
、ViewGroup
、TextView
等)中,因此您可能需要为每个子类创建一个包装器(MyImageView
、MyViewGroup
、MyTextView
等)。这些子类中的每个都将扩展AbstractView
并实现自己的a()
和b()
方法,但是继承通用的init()
方法(以及View
类中实现的所有方法)。然后,您可以为ImageView
、ViewGroup
、TextView
等中的现有行为创建需要保持不变的委托方法。
public class MyImageView extends AbstractView {
private ImageView wrappedImageView;
public MyImageView(Context context) {
wrappedImageView = new ImageView(context);
}
// TODO: Implement other constructor wrappers
final void clearColorFilter() {
wrappedImageView.clearColorFilter();
}
// TODO: Implement other method wrappers
@Override
public void a() {
// specific implementation here
}
@Override
public void b() {
// specific implementation here
}
}
您需要一个带有init()方法的新抽象类:
public abstract class MyAbstractView extends View {
public void init() {
//TODO: implement init
}
public abstract void a();
public abstract void b();
}
让您的类(ImageView、TextView)从这个抽象类继承。
如果我正确地不想要你的答案,你应该做的是:
public abstract class MyBaseView extends View{
public MyBaseView(Context context) {
super(context);
init();
// TODO Auto-generated constructor stub
}
private void init(){
}
public abstract void a();
public abstract void b();
}
然后使用再次扩展
public class MyView extends MyBaseView{
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public void a() {
// TODO Auto-generated method stub
}
@Override
public void b() {
// TODO Auto-generated method stub
}
}
您可以定义一个实现方法init()a()b()的类层次结构。根据层次结构中的子类,在具有的步骤中添加内容。最后,您的视图将调用此类上的方法并为其自身生成内容。
interface WidgetContent {
void init();
void a();
void b();
}
abstract class AbstractWidgetContent implements WidgetContent {
public void init(){}
public abstract void a();
public abstract void b();
}
class BaseViewWidgetContent extends AbstractWidgetContent {
public void a() {
}
public void b() {
}
}
class ImageViewWidgetContent extends BaseViewWidgetContent {
public void a() {
}
public void b() {
}
}
class PictureView extends ImageView{
ImageViewWidgetContent imageContent;
}