站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题如何隐藏父类中的某个方法或属性

如何隐藏父类中的某个方法或属性

摘要: 如何隐藏父类中的某个方法或属性


父类中有个属性不想让子类的实例访问
用private重写好象不行


up


属性定义成private的;
如果父类不可修改,那么在父类和子类直接再增加一层M,在M中重新定义这个变量。

不过你要干什么呢?


这个不可以,语法就这么规定的,要保护多态


比如我类c1里有个public getAA
c2继承c1
但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
如何隐藏呢


说过了不能隐藏

如果实在不想要
可以在子类中用空函数重写(override)

子类中
public int getAA(){}


对于继承来说,如果父类的函数或者成员是public的,那么你想隐藏也是隐不了的
唯一的办法就是你重写它,以于函数你可以用一个空的方法体去实现它。
对于成员变量,你可以重新定义一个一样的名字的,并赋一个不影响大局的值给 它


这个好像很难实现吧,



虽然是空函数
可是还是可以调用呀
反而会引起错误了
我要的效果是如果有调用的话就直接在编译时就要报错
要不然还有什么意义呢

这个好象是java的不合理地方,c#应该是可以的
好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制


-#34;我要的效果是如果有调用的话就直接在编译时就要报错
要不然还有什么意义呢-#34;
-_-#

楼主bt

-#34;好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制-#34;
这个bt


既然是public的,大家都可以访问,否则就声明成private的


可以使用 @deprecated来提示
在编译的时候可以制定编译级别,遇到这种警告就停止编译.
你能做的也就只是提示一下而已.他们非要使用,你也没办法


我真惊了,借大哥这块宝地,让我说说该说的话,我的blog不知道为什么激活不了。
CSDN不知道你们做什么去了,网站都维护不好,不真不知道该说什么了。
都去搞程序去了?像我这样的菜鸟,你们是看不起的。。我承认自己没水平,现在水平肯定比你们差,所有就想来向你们学习,可是,我的blog都不能用,你让我怎么想,郁闷了一晚上。
我感到悲哀,弄个网站还要两次激活,有这个必要吗?
这是谁的需求?过分的讲究安全就是脱了裤子放屁,自找麻烦 。
或者是疤瘌眼照镜子,自找难看。
我听说csdn是全国最专业的,有着最前沿的技术,可这次,我是真的受伤了太伤心,太心酸了
你们骂我,肯定不会回嘴的,我本来就是个菜鸟,super菜,无敌菜,菜比
恩,我是。。。
希望中国的程序越做越好,csdn成为中国的中流砥柱。。。。。



好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制??
public interface houzi {
public void walk();
}
public class 古猿 implements houzi {
public void walk() {
四个脚 走路
}
}
public class 人 implements houzi {
public void walk() {
两个脚 走路
}
}

很多时候是会碰到楼主的问题,想屏蔽父类的public方法,使的其他使用者不能直接调用,这个时候我们应该考虑我们设计的问题,是不是我们设计的不够合理呢??纯粹个人意见[我也想让java支持你说的,可接口放着不用也挺可惜啊]


up


虽然人是由古猿进化而来,但是人和古猿已经成了两种差别很大的概念,所以这跟程序中子类和父类的关系是不能类比的。

你应该检查一下自己的设计


高手在哪里?使用内部类,定义那个子类不能使用的方法!


比如我类c1里有个public getAA
c2继承c1
但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
如何隐藏呢

没可能


虽然是空函数
可是还是可以调用呀
反而会引起错误了
我要的效果是如果有调用的话就直接在编译时就要报错
要不然还有什么意义呢

这个好象是java的不合理地方,c#应该是可以的
好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制

语义不一样 java不是c# 没什么可比性


继承关系体现的就是is-a关系
如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。




继承关系体现的就是is-a关系
如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。

----------------------------
继承关系应该也不是所有的继承
除了用走路方式来描述四脚或二脚
假如有一天我们没办法走路了,变得能飞了不能走就去改写人类祖先的定义吗
因为c#也是对象化的语言,它可以,java不可以
那就不能说是因为开发者设计上的问题了
其实直接说java没办法做到就可以了嘛



虽然人是由古猿进化而来,但是人和古猿已经成了两种差别很大的概念,所以这跟程序中子类和父类的关系是不能类比的。

你应该检查一下自己的设计
-----------------------------------------------
假设说人真的是由古猿进化来的
那古猿是人的父类的父类的父类的父类的父类....
这种说法应该是成立了
你总不能说因为子类的功能比父类功能强很多就觉得它不再是子类了吧


如果有N多种数据库都支持事务处理
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务


有一句话:已经公开了的就不能再是秘密。


如果有N多种数据库都支持事务处理
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务
这是你要考虑你的类的层次关系,或者在MySql的子类里覆盖父类的行为。


如果有N多种数据库都支持事务处理
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务

====================================================
这种设计就是有问题的,这是接口的发挥空间

你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?




暂时没有看到一种语言隐藏父类方法的,因为这样不合理。


谁说不行的?!


当然是不能隐藏,隐藏本身就不合理(就不符合继承原理)
重写时抛出
throw UnsupportedOperationException() 就可以了


假设说人真的是由古猿进化来的
那古猿是人的父类的父类的父类的父类的父类....
这种说法应该是成立了
你总不能说因为子类的功能比父类功能强很多就觉得它不再是子类了吧

-----------------------------------------------
为什么进化就是父类呢 不明
简单的例子 鸡是由鸡蛋孵化的
你难道能说鸡蛋是鸡的父类


重写时抛出
throw UnsupportedOperationException() 就可以了

同意这个方法


感觉楼主想继承但不想成为 is-a 的关系

建议楼主加深对OOP的认识。


暂时没有看到一种语言隐藏父类方法的,因为这样不合理。
--------------
c#只要重写该方法,然后定义为private就可以了


这种设计就是有问题的,这是接口的发挥空间

你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?
---------------------------------
我当然没有比设计java的人还要牛,不过你这话根本就有问题,
如果java那么完美的话也就不会有1.0、2.0...这样更新了
我承认java是个好东西,也许我所提出来的问题不是java的缺点,
不过并不代表java是完美的哦,也并不代表设计java的人所有的方面都牛哦
你可别自卑,也许你某些方面就比他牛


感觉楼主想继承但不想成为 is-a 的关系

建议楼主加深对OOP的认识。
--------------------------------
我觉得理论是为实践服务的
而不是实践去迁就理论
读死书不见得是好事哦
所以哪怕是认识再深
如果不能用来解决事情
要来何用


用组合不要用继承就得了,你是你爸爸的儿子而你又不想跟你爸爸姓,有违常理吧


虽然说理论是为实践服务,但任何事物都有他的一套规则,你要实践就必须建立在不打破该规则的条件下。总不能说你要杀人就杀人,要放火就放火吧,社会有法治的,编程也一样,有它的一套体系啊


我感觉父类的概念有必要好好想一下,好比车是父类,而汽车,轿车,。。。是车的子类,父类的概念是其子类的共同点的集合,而对于古猿和人,可以说都是动物的子类,而不能说人是古猿的一种。人是古猿进化而来的,相当于你在写人(古猿)这个子类时改进了某些方法。


讨论的好,支持楼主~!


关注中~


本身这种设计就有问题,本不应该用继承。


java中自有艳如玉,java中自有黄金屋……啊,我只是路过


用组合不要用继承就得了,你是你爸爸的儿子而你又不想跟你爸爸姓,有违常理吧
--------------------------
那你也不至于所有的行为要都学老爸的嘛
总会有些他想做而你不想做的事嘛


同意旗鲁特的!

应该是:
throw UnsupportedOperationException()

Java的类库中就使用了这种方式!




再补充一下,人和古猿其实根本就不是父子类的关系,而是兄弟类的关系,甚至可以说是堂兄弟的关系。

一种极端的观点认为:任何class应该不是abstract的,就是final的,因为一个类既然能生成对象,它就不再具有抽象特性,因此也不应当再被继承。


interface Interface1{
public void getB();
public void getAA();
}
interface Interface2{
public void getA();
}
class FatherClass implements Interface2{
public void getA(){
System.out.println(-#34;This method was implements in FatherClass!-#34;);
}
public void getAA(){
System.out.println(-#34;This method is in FatherClass!-#34;);
}
}
class ChildClass extends FatherClass implements Interface1{
private ChildClass(){}
public static Interface1 getInstance(){
return new ChildClass();
}
public void getB(){
System.out.println(-#34;This method is in ChildClass!-#34;);
}
}
public class InheritanceClass{
public static void main(String[] args){
FatherClass f = new FatherClass();
Interface1 c = ChildClass.getInstance();
f.getA();
//c.getA();//error!
c.getAA();
c.getB();
}
}
有点笨,不过好歹有点楼主说的那个意思了.
一句话:关系好乱啊!


用final 声明方法是不可以被子类继承

用private 隐藏父类中的变量





其实类只是用来解决问题的一种方式,难倒仅因为人类和猿类这个继承的自然关系与类继承的关系形成冲突就要推翻类的继承吗?
省省 脑细胞吧。。


再说 谁说人类从古猿进化来的 就说人类是继承古猿呢。。。这根本是两码事。。


mark


如果只是隐藏很简单将c1装饰在c2中。

interface A{
c1,c2的公有的抽象方法
//假设getA方法
public void getA();
}

public class c1 implements A{
public void getAA(){}
public void getA(){}
}

public class c2 implements A{
private c1 c1=null;
public void getA(){
//除了实现功能,你也可以对c1的getA或者你需要的getAA进行调用
}
}

这样既对c1进行了封装,也对c1功能的扩展,以及c1,c2统一抽象了接口
在Eclipse源码中IAdaptable接口中的既要对系统的无限扩展,又不希望暴露其成员,当然以这个要复杂的多,可能是你需要的。


钻牛角尖,要是被我看见,我一定痛扁他一顿,冥顽不化.


↑返回目录
前一篇: 这段代码编译能通过么??
后一篇: 关于加载位于本地的Applet的问题。