美文网首页
利用继承和多态,规避GreenDao数据类无法继承字段

利用继承和多态,规避GreenDao数据类无法继承字段

作者: ccsosnfs | 来源:发表于2019-03-13 14:52 被阅读0次

有个内核SDK的数据类型A,其中有些字段。
还有基于A的数据类型B,继承复用A的字段,需要所有字段存在GreenDao数据库中,。
直接继承的话,GreenDao会忽视父类的字段。

我想到workaround方案就是子类需要父类的那些字段,就写上同名字段,这样GreenDao生成的子类get方法,可以同时被SDK内和上层调用。
同时上层和sdk互相传递数据也不用转换或者复制。

    class Parent {
        int i = 3;

        @Override
        public String toString() {
            return "Parent{" +
                    "i=" + i +
                    '}';
        }

        String getStrPub() {
            return "parent";
        }

        private String getStrPri() {
            return "parent-private";
        }
    }

    class Child extends Parent {
        int i = 5;

        @Override
        public String toString() {
            return "Child{" +
                    "super.i=" + super.i +
                    ", i=" + i +
                    '}';
        }

        public String getStrPub() {
            return "Child";
        }

        private String getStrPri() {
            return "Child-private";
        }
    }

    public void test() {
        Parent parent = new Parent();
        Parent teen = new Child();
        Child child = new Child();

        //child has both parent and self variable
        System.out.println(parent + " " + parent.i);
        System.out.println(teen + " " + teen.i);// if announce by parent, call it`s variable is parent`s
        System.out.println(child + " " + child.i);

        teen.i = 7;
        System.out.println("\n" + teen + " " + teen.i + " " + ((Child)teen).i);

        //child has only self`s method. Override
        System.out.println(parent.getStrPub() + " " + parent.getStrPri());
        System.out.println(teen.getStrPub() + " " + teen.getStrPri());// if announce by parent, call it`s method is parent`s.
        System.out.println(child.getStrPub() + " " + child.getStrPri());
    }

Parent{i=3} 3
Child{super.i=3, i=5} 3
Child{super.i=3, i=5} 5

Child{super.i=7, i=5} 7 5
parent parent-private
Child parent-private
Child Child-private

子类和父类同名同类型的属性,实际上并列存在于子类对象中,对象声明是父或子,调用时就调用对应父或子的字段。
子类和父类同名的非private方法,会覆盖。private方法无法覆盖,会并列存在。

父类的属性,体现的是 封装
子类继承,体现的是 继承
在父类sdk中,调用public get方法,实际调用的是子类的方法,并且SDK只有运行时才知道调用的是哪个子类的方法, 体现的是 多态

这里引用一位博主的一段话

作者:jianyuerensheng
来源:CSDN
原文:https://blog.csdn.net/jianyuerensheng/article/details/51602015

在这里我们需要明确,继承存在如下缺陷:

1、父类变,子类就必须变。

2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。

3、继承是一种强耦合关系。

所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。

相关文章

  • 利用继承和多态,规避GreenDao数据类无法继承字段

    有个内核SDK的数据类型A,其中有些字段。还有基于A的数据类型B,继承复用A的字段,需要所有字段存在GreenDa...

  • 数据库

    GreenDao greendao数据表继承父类的字段?子类继承父类,并包含同名字段,override父类的get...

  • Java继承和多态

    Java继承和多态 继承 定义 继承就是利用现有类创建新类的过程,现有的类称为 父类(基类),新类称为 子类(派生...

  • Cpp6 封装、继承和多态

    Cpp6 封装、继承和多态 继承 子类从父类继承成员变量 子类从父类继承成员函数 实现数据隐藏 为什么要隐藏数据成...

  • 文本查询程序

    //面向对象的核心是,抽象继承多态。抽象把数据实现隐藏,暴露公共接口继承和多态,派生类继承基类,降低代码重复性,通...

  • 2019-06-29 Java面向对象的程序设计(二)

    类的继承性 类的继承性表现为子类继承父类相关的数据成员和成员方法。 类的多态性 多态是指同名的不同方法根据发送消息...

  • 继承和多态的实现,封装

    继承和多态的实现,封装 继承是指从已有的类派生出新类,新类能使用已有类的数据属性和行为。继承的方式有三种:实现继承...

  • Python类和实例

    关键词:class 继承和多态:(object) 如果没有其他需要继承的类,则默认继承(object) 多态这里和...

  • python基础-09-面向对象、装饰器

    面向对象 类概念 类的定义 类的实例化 类和实例的属性 类的私有变量 数据封装 继承 多态 多继承 类的特殊方法 ...

  • 31-封装、继承、多态

    封装、继承、多态 面向对象编程有三大重要特征:封装、继承和多态。 继承 继承机制实现了代码的复用,多个类公用的代码...

网友评论

      本文标题:利用继承和多态,规避GreenDao数据类无法继承字段

      本文链接:https://www.haomeiwen.com/subject/wvgzpqtx.html