覆盖属性

匿名:

覆盖方法时,必须保留方法的签名,并且不能降低其可见性。现在,我尝试使用属性执行此操作时会发生什么。我很惊讶-它有效!看你自己:

public class A {

    public Integer myAttribute;

}

public class B extends A {

    public String myAttribute;

}

public class Main {

        public static void main(String[] args) {
        B b = new B();
        b.myAttribute = "myString";
        ((A) b).myAttribute = 1337;
        System.out.println(b.myAttribute);
        System.out.println(((A)b).myAttribute);
    }

}

因此,可以在子类中使用与超类相同的名称来编写属性,但是可以使用不同的可见性(修饰符)和类型。因此,我要说的是,超类和子类中的属性几乎完全相互独立。

现在,如果您确实在超类和子类中使用相同的属性名称,则可以有效地隐藏超类的属性。使用子类访问属性时,将获得子类的属性。但是超类的属性也在那里!您必须执行强制转换才能从外部访问超类的属性。从内部“ super”关键字应该有用。

问题1:现在基本上您有两个具有相同名称的不同属性。这不是打破LSP吗?

我之所以这么详细,是因为:我正在尝试一个自写的持久性框架。我想读取对象的完整内部状态并保持该状态。我通过反射读取了所有属性的值,从子类型开始并遍历超类。现在,如果在超类和子类中有两个具有相同名称的属性,我必须记住该类声明了一个属性,以便能够将属性值映射到正确的属性并恢复对象的状态。

问题2:还有其他想法如何处理这个细节吗?问题3:其他持久性框架如何处理此细节?

我从未见过使用这个细节。用相同的名称编写两个属性也许有点难看,但是有可能并且任何持久性框架都可能遇到它。也许在某些情况下该技术可能有用。

提前谢谢。

博zh:

ORM通常使用定义“属性”的javabeans标准。属性由读取器和/或写入器方法定义,而不是由它们读取/写入的字段定义。在99%的案例中,属性是field + getter&setter,但并非必须如此。并且ORM读取这些属性,并仅检测具有getters和setters的字段。由于方法被覆盖而不是被遮盖,因此问题消失了。

这是封装的问题,而不是违反LSP的问题。字段访问不受多态性的影响,因此,如果您拥有Foo foo = new FooSubclas();foo.field the value of theFoo`字段,则表示行为不会改变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章