c#对象:先有鸡还是先有蛋?

        碰巧看到 吕震宇 兄的文章  C#设计模式(1) ,中提到 先有鸡还是先有蛋 的代码
None.gif using  System;
None.gif
None.gif
class  Client
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public static void Main ()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      Base b 
= new Base();
InBlock.gif      Derived d 
= new Derived();
InBlock.gif      b.d 
= d;
InBlock.gif      Console.WriteLine(b.d.m);      
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif
None.gif
class  Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public int n = 9;
InBlock.gif   
public Derived d;
ExpandedBlockEnd.gif}

None.gif
None.gif
class  Derived : Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public int m = 10;   
ExpandedBlockEnd.gif}
        “Derived继承自Base,可以说没有Base就没有Derived,可Base里面有一个成员是Derived类型。到底是先有鸡还是先有蛋?这个程序可以正常编译执行并打印结果10。”
     
         上面提到可以正常编译并能打印结果,是没错,不过这不能说明先有鸡还是先有蛋这个问题。先有鸡还是先有蛋是说是鸡先生蛋呢还是蛋生鸡。在上面的代码中Base类声明有一个Derrived类,在Base实例化时,也就是“生”的时候并没有把Derrived类也“生”出来,因此不能说明问题.
         Base类声明有一个Derrived类,也就是Base类的实例有一个指向Derrived类的指针,这是个引用问题,而这个引用在Base类创建时为null。
         看下面的代码:
None.gif using  System;
None.gif
None.gif
class  Client
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public static void Main ()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Base b 
= new Base();
InBlock.gif        Derived d 
= new Derived();
InBlock.gif        b.d 
= d;
InBlock.gif        Console.WriteLine(b.d.m);      
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
class  Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public Base()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.d = new Derived();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int n = 9;
InBlock.gif    
public Derived d;
ExpandedBlockEnd.gif}

None.gif
None.gif
class  Derived : Base
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public Derived() : base()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int m = 10;   
ExpandedBlockEnd.gif}
         在上面的代码中Base类声明有一个Derrived类,在Base实例化时,也就是“生”的时候把Derrived类也“生”出来,编译通过,运行的时候死循环!
        我不知道有什么托管对象可以先在Object对象之前创建出来!
        Object对象作为所有其他对象的根对象,自然Object对象先创建出来,也就是说先有Object再有其他派生对象。


转载于:https://www.cnblogs.com/ofei/archive/2007/05/28/762822.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值