OOP里, 所谓的恶意继承, 究竟是什么意思?
我看到好多书说, 父类, 封装该封装的, 暴露该暴露的, 以免被恶意继承. 比如:
package org.fan.fucker;
class Parent {
private String name;
private void doSomething(){
}
}
我在想, 那个
doSomething
的访问权限改成
protected
那又如何? 我接下来的
Sub
类给继承了, 然后
override
又如何? 我既然能继承
Parent
, 说明我能看到
Parent
的源代码, 即, 我也是该
Parent
类的项目的编写者之一.
问: 何来的恶意继承? 什么叫
恶意
? 假设这里的
恶意
就是指编码者另外写了个类, 然后继承
Parent
, 再然后重写
doSomething
, 代码乱写. 那么老板同事早把他K了吧.
真搞不懂什么叫
恶意
, 难不成我得到一份用Java写的商业项目软件(没源代码), 然后猜测到里面有个叫
encryption
类, 于是我
恶意
继承了, 再乱写里面
decode
方法, 然后就破解了?
Answers
写了一个简单的测试
public class vitalinherit {
public static void main(String[] args) {
father f = new father();
child c = new child();
c.change("abc");
System.out.println(c.getName());
}
}
class father{
String name;
public void setName(String name){
this.name = "father set:"+name;
}
public void change(String name){
setName(name);
}
public String getName(){
return name;
}
}
class child extends father{
@Override
public void setName(String name) {
this.name = "child set:"+name;
}
}
此例最终输出结果:
child set:abc
Process finished with exit code 0
父类setName方法被覆盖,直接影响到子类调用父类中引用该被覆盖方法的其他类的执行结果。
还是第一次看到“恶意继承”这个词,立即上 Google 搜索了下,除了本贴以外也不能找到其他例子。题主能否给出书名,并引用这个词出现的段落?
OO 的封装的目的是将本来全局可见的变量向其他可能误用的程序员隐藏,以避免使用者误解,并错误使用它。但它本身不是什么安全机制,应该并无什么防止“恶意”使用的能力:原因非常简单,不管是否有源码在手,库的使用者总是可以通过内存机制(如 Java 可以改字节码来改变范围)来“恶意”使用它。
设计 OO 语言时往往将可见性作为重点,要求程序员尽可能小地赋予可见性范围。能 private 就不 protected,能 protected 就不 public,但这实际上是过时的思路了。OO 设计时应该尽可能面对接口编程,在 Java 上就是尽可能使用 interface,而不要依赖类的可见性约束。如果你的类是通过接口对外提供服务,那么本身的方法即使全部是 public,也并不影响外界的理解和使用,反而会提供更多的扩展机会。