当您重写一个方法时,您必须保留该方法的签名并且不能降低它的可见性。现在我尝试使用属性执行此操作时会发生什么。我很惊讶 - 它有效!看看你自己:
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 class)中相同的属性名称编写属性,但可以使用不同的可见性(修饰符)和类型。所以我会说父类(super class)和子类中的属性几乎完全相互独立。
现在,如果您真的在父类(super class)和子类中使用相同的属性名称,您实际上隐藏了父类(super class)的属性。使用子类访问属性时,您将获得子类的属性。但是父类(super class)的属性也在那里!您必须执行强制转换才能从外部访问父类(super class)的属性。从内部“super”关键字应该是有用的。
问题一: 现在基本上你有两个同名的不同属性。这不打破LSP ?
为什么我来到这个细节是这样的: 我正在试验一个自写的持久性框架。我想读取对象的完整内部状态并保留该状态。我通过反射读取所有属性的值,从子类型开始并遍历父类(super class)。 现在,如果父类(super class)和子类中有两个同名的属性,我必须记住声明属性的类,以便能够将属性值映射到正确的属性并恢复对象的状态。
问题二: 还有其他想法如何处理这个细节吗? 问题三: 其他持久性框架如何处理这个细节?
我从未见过这个细节在使用中。也许写两个同名的属性有点难看,但这是可能的,任何持久性框架都可能遇到它。也许在某些情况下这种技术可能有用。
提前谢谢。
最佳答案
ORM 通常使用定义“属性”的 javabean 标准。属性由读取器和/或写入器方法定义,而不是它们读取/写入的字段。在 99% 的情况下,属性都是 field+getter&setter,但不一定是这样。 ORM 读取这些属性,并仅检测具有 getters 和 setters 的字段。由于方法被覆盖而不是隐藏,问题就消失了。
这与其说是违反 LSP,不如说是封装问题。字段访问不受多态性影响,因此如果您有 Foo foo = new FooSubclas();foo.fieldFoo` 字段的值将被采用,这意味着行为不会改变。
关于java - 覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6692366/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www