我有一些 View 子类的实例(如 ImageView、ViewGroup、TextView 等),我让它们都实现了两个方法 a() 和 b(),它们都必须运行相同的 init() 方法,该方法很长并为所有这些做同样的事情。在这种情况下,我应该如何设计我的架构以增强代码的可重用性?
如果它是 C++,我可以从视图和一个在创建时运行 init() 并具有抽象方法 a() 和 b() 的新抽象类进行多重继承,它是如何在 Java 中实现的?
也许有某种方法可以使用某种装饰器来实现它?
我有一些 View 子类的实例(如 ImageView、ViewGroup、TextView 等),我让它们都实现了两个方法 a() 和 b(),它们都必须运行相同的 init() 方法,该方法很长并为所有这些做同样的事情。在这种情况下,我应该如何设计我的架构以增强代码的可重用性?
如果它是 C++,我可以从视图和一个在创建时运行 init() 并具有抽象方法 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;
}