Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承问题_Java_Android_Oop_Inheritance - Fatal编程技术网

Java 继承问题

Java 继承问题,java,android,oop,inheritance,Java,Android,Oop,Inheritance,我正在为android创建一个自定义布局。 布局实现完全相同,但我需要从RelativeLayout扩展一次,从LinearLayout扩展一次 class Layout1 extends LinearLayout { // methods and fields } class Layout2 extends RelativeLayout { // the same EXACT methods and fields } 如何使用继承来避免代码复制并实现我的方法一次。 我不知道它是否适合您的用

我正在为android创建一个自定义布局。 布局实现完全相同,但我需要从RelativeLayout扩展一次,从LinearLayout扩展一次

class Layout1 extends LinearLayout {
// methods and fields
}

class Layout2 extends RelativeLayout {
// the same EXACT methods and fields
}

如何使用继承来避免代码复制并实现我的方法一次。

我不知道它是否适合您的用例,但您可以考虑通过添加“其他”类的字段来使用委托。


我很悲观,因为这些课程的关系太密切了。

你可以使用作文和类似“策略”的模式:

您甚至可以在运行时更改
策略


这样,您的
YourLayout
类可以同时使用这两种场景

我使用了委托,尽管有点不同。类中唯一的重载方法是重载的dispatchDraw。所以我把它移到了一个不同的类中,并在每个扩展的类中包含了它的一个实例

 class MyLinearLayout extends LinearLayout {
        MyDraw md = new MyDraw();

        @Override
        protected void dispatchDraw(Canvas canvas) {    
            md.draw(canvas);
            super.dispatchDraw(canvas);
        }
 }

 class MyRelativeLayout extends RelativeLayout {
      //    as above
 }

虽然我还有两个扩展的类,但我不会复制之前复制过的代码,这正是我想要实现的。

我不认为你想避免DRY…@Jason是的,你是对的,如果这对于你来说太复杂了,我建议实现一个包含所有常见行为的抽象视图组,然后让两个布局使用它们的特定行为扩展抽象视图组。
 class MyLinearLayout extends LinearLayout {
        MyDraw md = new MyDraw();

        @Override
        protected void dispatchDraw(Canvas canvas) {    
            md.draw(canvas);
            super.dispatchDraw(canvas);
        }
 }

 class MyRelativeLayout extends RelativeLayout {
      //    as above
 }