您的位置:程序门 -> .net技术 -> c#



c# 类重载陷阱


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


c# 类重载陷阱
发表于:2007-01-25 09:10:46 楼主
using   system;

///   <summary>
///     基类
///   </summary>
public   class   resultstyleofitemsbase
{
///   <summary>
///   构建表格
///   </summary>
public   virtual   void   buildtable()
{
createheader(     );   //掉用本类中的   createheader
createitems(     );               //掉用本类中的   createitems
}

///   <summary>
///   构建表头
///   </summary>
protected   virtual   void   createheader(   )
{
console.writeline( "基类.createheader() ");
}

///   <summary>
///   构建行
///   </summary>
protected   virtual   void   createitems(   )
{
console.writeline( "基类.createitems() ");
}
}

///   <summary>
///     派生类
///   </summary>
public   class   resultstyleofitemsscoring   :   resultstyleofitemsbase
{
///   <summary>
///   构建表格
///   </summary>
public   override   void   buildtable()
{
base.buildtable();

createheader(   );   //掉用本类中的   createheader
createitems(   );   //掉用本类中的   createitems
}

///   <summary>
///   创建表头
///   </summary>
protected   override   void   createheader()
{
console.writeline( "派生类.createheader() ");
}

///   <summary>
///构建行
///   </summary>
///   <param   name= "list "> </param>
protected   override   void   createitems(   )
{
console.writeline( "派生类.createitems() ");
}
}

///   <summary>
///调用类
///   </summary>
public   class   app
{
public   static   void   main()  
{
resultstyleofitemsbase   items=   new   resultstyleofitemsscoring();
items.buildtable();
}
}

/*
编译:c:\windows\microsoft.net\framework\v2.0.50727> csc   /target:exe   /out: "c:\my   documents\重载陷阱.exe "
"c:\my   documents\重载陷阱.cs "
在main方法中创建了的resultstyleofitemsscoring的实例,在此实例的buildtable()重载了基类的相同方法,在基类的方法buildtable()中先后
调用了
createheader(     );  
createitems(     );    
设计的本意是   用基类的buildtable()方法调用基类自身的createheader(   )、createitems(   )方法,
派生类的buildtable()调用派生类的createheader(   )、createitems(   )方法,
没有想到因为在派生类中也重载基类的createheader(   )、createitems(   )方法,在基类的buildtable()方法中调用
createheader()、createitems()两个方法时是调用派生类中重载的createheader(   )、createitems(   )。
在本例中输出为:
派生类.createheader()
派生类.createitems()
派生类.createheader()
派生类.createitems()
基类中的createheader(   )、createitems(   )方法根本没有执行的可能。

最后只有更改设计createheader(   )、createitems(   )两个方法改为私有!*/
发表于:2007-01-25 09:20:401楼 得分:0
这是你的设计问题,你写代码的时候就应该知道是这样运行的。
你可以这样设计,只在基类中提供一个buildtable方法,这是一个模板方法,调用createheader、、createitems方法。createheader、、createitems在基类中提供部分实现(或是抽象的),在子类中完全实现,子类中就不用再有buildtable了。
发表于:2007-01-25 09:26:362楼 得分:0
这个base.buildtable()有问题吧,既然你已经执行了基类的createheader(     );   createitems(     );     这两个方法了,后面你又执行一次?
发表于:2007-01-25 12:43:403楼 得分:0
请楼主解释一下啊。。。。。。。。。。
发表于:2007-01-25 14:08:034楼 得分:0
良好的设计可以避免这个问题,但c#中这个问题还是存在的啊
发表于:2007-01-25 14:23:145楼 得分:0
这怎么算是问题呢,你已经覆盖了原来的方法,原来的方法当然不能调用了
发表于:2007-01-25 14:32:476楼 得分:0
主要还是看你想不想保留基类的方法,要是想保留的话还想在子类里也写一个同名称方法,就用new关键字
protected   new   void   createitems(   )
{
console.writeline( "派生类.createitems() ");
}
否则一个虚方法被覆盖当然就不能用了。
public   class   resultstyleofitemsscoring   :   resultstyleofitemsbase
{
///   <summary>
///   构建表格
///   </summary>
public   override   void   buildtable()
{
base.buildtable();

createheader(   );   //掉用本类中的   createheader
createitems(   );   //掉用本类中的   createitems
}

///   <summary>
///   创建表头
///   </summary>
protected   new   void   createheader()
{
console.writeline( "派生类.createheader() ");
}

///   <summary>
///构建行
///   </summary>
///   <param   name= "list "> </param>
protected   new   void   createitems(   )
{
console.writeline( "派生类.createitems() ");
}
}
这样的输出结果你就满意了吧


快速检索

最新资讯
热门点击