惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
S
Securelist
MyScale Blog
MyScale Blog
Jina AI
Jina AI
罗磊的独立博客
The Cloudflare Blog
美团技术团队
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
雷峰网
雷峰网
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
博客园 - 聂微东
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
博客园_首页
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
D
Docker
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
B
Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Security Latest
Security Latest
V2EX - 技术
V2EX - 技术
N
News | PayPal Newsroom
Microsoft Security Blog
Microsoft Security Blog

博客园 - 难得一蠢

去掉恼人的XHTML验证.. 完整linux下配置RMagick步骤 解决RMagick.so cannot open shared object问题 如何让apache支持.shtml 让apache支持include标签 安装FastCgi错误( In function `init_module': ) 解决办法 [收藏]上班族的真实写照 使用GDI+绘制高质量图和字体(2) 双截棍 C语言版 (超搞笑) [转]C++0x展望[语言核心进化] 游子的心-祝福母亲 为了车票而奔波着..... 使用GDI+绘制高质量图和字体 MSN8.0测试邀请发放 李连杰年度巨作<霍元甲>主题曲:周杰伦唱 小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll 管理者,请还程序员一片净土!! Java剑 VS .NET刀 -- 东山再起(论模式)(二)【推荐】 测测你的智商--我是92,属于弱智,唉 Java剑 VS .NET刀 -- 晨袭血战(论模式)(一)【推荐】 UML利器--Rational Rose Enterprise Edition 2003 安装破解步骤
小蠢笔记:从继承特性来看构造函数
难得一蠢 · 2006-01-24 · via 博客园 - 难得一蠢

小蠢笔记:从继承特性来看构造函数

      面向对象的三大特性之一就是继承,而使用继承的时候,必须要把握好的就是父类与子类之间的关系..避免使用过多的父子层次..说到关系,最先接触到的则是构造函数..为什么??OK.看下面的代码,大部分的公司面试的时候可能都会有这么一道类似的题..考的目的就是看你对构造函数的理解..

 1class a
 2{
 3    public a(int i )
 4    {
 5        Console.WriteLine( "父类初始化" + i );
 6    }

 7    
 8}

 9
10class b:a
11{
12    public b()
13    {
14        Console.WriteLine( "继承类初始化" );
15    }

16    
17}

18
19static void Main(string[] args)
20{
21    b bb = new b();
22}

     看过上面简单的代码,只是段简单的类继承而已..但是如果没有使用过继承,或者没遇到过类似代码..第一反应可能,输出的结果应该是:继承类初始化..

     但是事实恰恰相反.这段代码不会通过编译..报错: 重载“a”方法未获取“0”参数...先来看一下class b的执行过程,当你声明它的时候,会先调用父类
a的构造,再调用子类b自己的构造函数..因为我们的a构造函数必须传递一个int参数,而b构造函数不需要传递参数.这样就造成了矛盾,在使用class b时,系统要先构造出a来,而a的构造函数需要一个参数,此时子类b的构造函数并没有满足a的构造函数,.所以才造成这样的错误..

     解决的办法有很多,最简单的办法就是,可以给父类的构造函数提供一个无参数的构造函数..

 1class a
 2{
 3    public a(int i )
 4    {
 5        Console.WriteLine( "父类初始化" + i );
 6    }

 7    
 8    public a(){
 9        Console.WriteLine( "父类初始化" );
10    }

11
12}


     把class a添加了这么一个无参数的构造函数后,错误就没有了..class b可以被正常的实例化..但是这样的情况并不是通用..当你需要在子类中使用父类中的方法,而父类的方法需要根据有参数的构造函数进行初始化某些属性的时候..这个简单的办法就失去了意义...比如,一个父亲,一个儿子,根据火星人类研究基地的报告,一般儿子的IQ是受父亲IQ的影响的,即父亲的IQ直接影响了儿子的IQ...这个时候这个类的设计代码可以如下..

 1using System;
 2
 3namespace Overloading
 4{
 5    /// <summary>
 6    /// Class1 的摘要说明。
 7    /// </summary>

 8    class Class1
 9    {
10        /// <summary>
11        /// 应用程序的主入口点。
12        /// </summary>

13        [STAThread]
14        static void Main(string[] args)
15        {
16            b bb = new b(22);
17            Console.WriteLine( "父类的IQ:" + bb.a_IQ );
18            Console.WriteLine( "子类的IQ:" + bb.IQ );
19        }

20    }

21    
22    class a
23    {
24        //public a(){}        这个可以根据情况添加
25        
26        public a( int i ) 
27        {
28            Console.WriteLine( "父类初始化" + i );
29            this._IQ = i;
30        }

31        
32        private int _IQ;
33        public int IQ
34        {
35            get return _IQ; } 
36            set { _IQ = value; } 
37        }

38    }

39    
40    class b:a 
41    {
42        public b():base(0
43        {
44            Console.WriteLine( "继承类初始化" );
45            this._IQ = 1;
46        }

47        
48        public b(int i):base(i) 
49        
50            Console.WriteLine("子类初始化" + i);
51            this._IQ = i;
52        }
 
53        
54        private int _IQ;
55        new public int IQ                    //在这里覆盖了父类的IQ值
56        {
57            get return this._IQ + base.IQ; } //子类的IQ值是父类+子类的IQ
58            set { _IQ = value; }  
59        }

60        
61        public string a_IQ
62        {
63            get return base.IQ.ToString(); } 
64        }

65        
66    }

67}

68


代码运行的结果:

     上面的代码编译后,从结果可以看出来..继承带来了方便的同时,无形中也增加了类设计的复杂度和耦合度..我想,这个也是为什么大多数书籍都推荐我们,使用继承的时候尽量不要有太多的层次关系的原因之一吧..这个就好像,一个父亲有了N个儿子之后,对于国家(框架)和父亲来说,负担都是太大太大了..要照顾的有N个..所以,合理有效的使用继承还是需要研究.琢磨,试验的..明白了上面两个小例子之后,再面试的时候碰到类似的问题,就可以避免失分咯..何况这个题目是如此的简单..这道要是做错了..嘿嘿...后果可想而知哦....

posted on 2006-01-24 16:52  难得一蠢  阅读(3461)  评论()    收藏  举报