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

      面向对象的三大特性之一就是继承,而使用继承的时候,必须要把握好的就是父类与子类之间的关系..避免使用过多的父子层次..说到关系,最先接触到的则是构造函数..为什么??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  难得一蠢  阅读(3436)  评论(11编辑  收藏  举报