我得到了View的子类的几个实例(如ImageView,ViewGroup,TextView等),我让它们都实现了两个方法a()和b(),它们都有运行相同的init()方法,并且对所有这些方法都是相同的。 在这种情况下,我应该如何设计我的架构以增强代码的可重用性?设计问题:增强代码的可重用性的具体情况
如果是C++,我可以从视图中多次继承,并且在创建时运行init()并具有abstarct方法a()和b()的新抽象类,它在Java中如何实现?
也许有某种方法可以使用某种装饰器实现它吗?
我得到了View的子类的几个实例(如ImageView,ViewGroup,TextView等),我让它们都实现了两个方法a()和b(),它们都有运行相同的init()方法,并且对所有这些方法都是相同的。 在这种情况下,我应该如何设计我的架构以增强代码的可重用性?设计问题:增强代码的可重用性的具体情况
如果是C++,我可以从视图中多次继承,并且在创建时运行init()并具有abstarct方法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
类实现的方法一起。然后,您可以创建委托方法为exising行为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
}
}
另外'View'可以被声明为一个接口,它定义了所有视图都应该绑定的合约。 –
@ArunManivannan这是一种可能性,但Android已经有一个'View'类。目前还不清楚OP是在扩展还是从头开始。 –
哎呀。没有注意到“android”标签。对于那个很抱歉。 –
你需要一个新的抽象类的init()方法:
public abstract class MyAbstractView extends View {
public void init() {
//TODO: implement init
}
public abstract void a();
public abstract void b();
}
让你的类(IMA geView,TextView)从这个抽象类继承。
他们不是我的班,ImageView的等内置在Android中,这就是为什么basiclly我没有用这种方法就 –
@OfekRon如果这些类是内置的去的话,你怎么做到:_i把它们都实现两个方法()和b()_ – LuGo
如果我正确undestood你的答案,你应该做的是:
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
}
}
可以定义一个类层次结构,其实现方法初始化:
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();
}
,然后再次使用它扩大()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;
}
我想创建一个单独的“全局”类,你可以摆在那里方法,将多个activites使用,从需要它们的类调用它们。在每个班级,当你需要它只是调用'Globals.a()' – codeMagic
不能说我同意这种做法。 – AHungerArtist
@codeMagic这是结构化编程,应该避免。 – LuGo