收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 4718|回复: 10

[AS3] 怎样理解父类的Private属性不能被子类继承?

[复制链接]
发表于 2008-8-30 11:44:20 | 显示全部楼层 |阅读模式
[/code]主类:
[code]package {
        import flash.display.Sprite;
        import nodihsop.Extender;
        import nodihsop.Base;
        public class Main extends Sprite {
                private var A:Base = new Base("A");
                private var B:Extender = new Extender("B");
                public function Main() {
                        init();
                }
                private function init() {
                        A.hello();
                                                B.hello();
                }
        }
}[/code]
父类(位于Nodihsop包中)
[code]package nodihsop{
        public class Base {

                private var _name:String;

                public function Base(name:String) {
                        _name = name;
                }
                private function sayHello() {
                        trace(_name);
                }
                public function hello() {
                        sayHello();
                }
        }
}[/code]
子类(位于nodihsop包中):
[code]package nodihsop{
        public class Extender extends Base {
                public function Extender(name:String) {
                        super(name);
                }
        }
}[/code]
运行输出:
A
B
疑问: B.hello();既执行了private方法sayHello();也访问了private属性_name,B自己并没有这个方法和这个属性的,怎么理解这个不能“继承”?难道这个不能“继承”应该理解成不能“访问”么?

my test.rar

5.38 KB, 下载次数: 286

 楼主| 发表于 2008-8-30 18:07:35 | 显示全部楼层
其实我想的是,
B仅仅从A那里继承了一个对外接口
public function hello() {
            sayHello();
        }
它不应该有sayHello();和_name,但是我就不不能理解为什么实际上它不仅可以sayHello(),而且还能输出_name
回复 支持 反对

使用道具 举报

发表于 2008-8-30 18:40:22 | 显示全部楼层
private,public,internal,protected只是外部访问的权限不同,继承后private属性当然也被继承了,只是外部仍然访问不了,但类的内部还是可以访问到的
回复 支持 反对

使用道具 举报

发表于 2008-8-31 09:45:01 | 显示全部楼层
晕,你用了一个公共方法去访问它当然可以了,如果不行还要private有什么用.
private就是只让你在内部可见的.
B.hello()调用的是基类的方法,仍然是通过基类去访问自己的private属性和方法.
回复 支持 反对

使用道具 举报

发表于 2008-8-31 18:07:21 | 显示全部楼层
private的作用当然起到了,父类的public function hello(){}就相当于是个外部访问的接口,不通过这个你直接B.sayHello() 是不行的.
回复 支持 反对

使用道具 举报

发表于 2008-9-1 08:53:03 | 显示全部楼层
不是说 除了  private 以外其他的访问控制符都可以被子类继承的  internal 要看情况·········

     继续看看······学习ing·····················
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-1 09:21:32 | 显示全部楼层
那它输出的那个"B"是什么东西呢?B应该是没有_name这个属性的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-1 09:23:39 | 显示全部楼层
原帖由 [i]ycccc8202 于 2008-8-31 18:07 发表
private的作用当然起到了,父类的public function hello(){}就相当于是个外部访问的接口,不通过这个你直接B.sayHello() 是不行的.
那么,这里是使用的是父类的私有方法,访问的是父类的私有属性了?难道是创建了一个父类的实例?
回复 支持 反对

使用道具 举报

发表于 2008-9-3 10:14:57 | 显示全部楼层
private不被继承的意思是派生类不可见。。你在原来的类建立了一个_i的私有属性,并不妨碍在派生类再建一个,不会告诉你重复。
原来所有的方法其实都在的,因为原来的方法可能会去调。

只是可见性的问题,内存空间都是要占的。
回复 支持 反对

使用道具 举报

发表于 2008-9-3 10:52:58 | 显示全部楼层
private function sayHello() {
            trace(_name);
        }
        public function hello() {
            sayHello();
        }
接口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 09:41:12 | 显示全部楼层
原帖由 [i]flashyiyi 于 2008-9-3 10:14 发表
private不被继承的意思是派生类不可见。。你在原来的类建立了一个_i的私有属性,并不妨碍在派生类再建一个,不会告诉你重复。
原来所有的方法其实都在的,因为原来的方法可能会去调。

只是可见性的问题,内存空间 ...

原来只是可见与不可见的问题,实际上内存里面依旧存在啊。谢谢了。我原来以为private既然不能被子类继承,那么就不应该有那个方法和那个属性才对,看来是有的,只是不能访问而已
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-3-31 16:54 , Processed in 0.093514 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表