virtual主要是实现重载,多态指的十多个方法名称相同、但是参数不同。
解决方案 »
- C# Winform项目界面风格的设置
- 求GDI+绘制文本的问题
- LED(CL2005) 用图片显示,滚屏!
- C#中给数据库用MD5加密
- 即时通信
- 下拉菜单的帮定
- webform中,如何读取document.all.checked.value值?
- Font '?' cannot be found.(C#验证码无法显示)
- datagridview綁定datatable,想要在7-19點,19-次日7點分別顯示一個不同表格,怎麼實現?
- 在remonting中,关于接口的使用问题,请大家讨论。(人穷,没分,但我会一辈子感激各位的)
- CLR和.NET Framework
- 在C#中怎么使用支持MFC的COM???
十多个方法名称相同、但是参数不同 是重载的,override是另种重载呀.我觉得你懂得没我多呢.virtural当然可以属性.outspaceman(狮子洋)
我看了 C#完全手册,就这里一点小细节了.
{
public virtual int Feet
{
get;
}
}public class Dog : Animal
{
private int feet = 4;
public override int Feet
{ get return feet; }
}public class Duck : Animal
{
private int feet = 2;
public ovveride int Feet
{ get return feet; }
}public class MainClass
{
public static void Main()
{
Animal animal_1 = new Dog(); //多态初始化方式
Animal animal_2 = new Duck();
Consol.Writeline( amimal_1.Feet); //多态展示
Consol.Writeline( amimal_1.Feet);
}
}
如此,可保持类设计的灵活性.
属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:可见,
public virtual int Feet
{
get;
}
是一个 get 访问器,因为他是一个virtual,所以没有给出具体实现。这样做主要是为了多态!
相当于用virtual实现了成员方法的多态!
也都是, 它们统统具备多态的特性. 所以,如果楼主尽可参考这些语言的多态资料.C#中的属性,是其方法的浓缩影子,浓缩成没有参数列表,而又可以返回和传值(咋看有点
矛盾的称呼)的方法. [在C++中,实现它,就要用方法.]上面示例先定义一个基类: 动物, 有一个属性: 脚. 基类,通常是在现实中不存在的,
弄出这个东西,调用它的用户就得更大的扩展性. (扩展性,灵活性,不是说出来的,是写出来的 :) )怎么扩展,怎么灵活? 比如,碰到一个变态的动物管理员, 非要数数动物园里的动物,共有几只
脚. 别骂他,谁让人家是钱老大那. 那么没有多态的做法是:public enum Animal
{ Dog = 4, Duck = 2, Wolf = 4 }static public void Main()
{
long feetCount = 0;
feetCount += Animal.Dog;
feetCount += Animal.Duck;
feetCount += Animal.Wolf;
Console.WriteLine( feetCount ); // display: 10
}看到结果后,BT大发雷霆, 我的狗子有10只, 鸭子有3只, 狼仔1只, 你当我是白痴, 10只脚?
哦, 哦, 应该是:
...
feetCount += (Animal.Dog * 10);
...
[幕后台词, 编码人员维护一次,骂娘一次]结果BT又吼: 我刚买的驴子没腿吗?
靠,再改:
public enum Animal
{ Dog = 4, Duck = 2, Wolf = 4, Donkey = 4 }static public void Main()
{
long feetCount = 0;
feetCount += ( Animal.Dog * 10 );
feetCount += ( Animal.Duck * 3 );
feetCount += ( Animal.Wolf * 1 ); //发现了没有,每增加一个种类,这要加一行?
feetCount += ( Amimal.Donkey * 2 ); Console.WriteLine( feetCount ); // display: 没算.
}"猪脑子, 难道说我只喜欢腿, 就不喜欢尾巴了吗?" BT抓狂了.
又来了,难道要咱们苦命的编码机器再写个 enum Ani_Tail{} ? 再象数腿代码一样,
再数一数尾巴? 再多个美洲虎,怎么办? 两个 enum 再行扩展? 天知道BT会不会让咱们
数耳朵,鼻孔眼.
[幕后台词, 不想维护, 骂祖宗n次](待接..)
显而易见,上面我写了个垃圾的动物管理系统.原因何在?
1.思想封闭,见树是树,不知有林.
就是用户说一时,就做成一,不去考虑是否能变成二.2.编码硬板.
enum通常用于固定常量定义, 显然动物种类不是. 这就意味着设计思路
走偏了,把一般性,设计成了特殊性. 即,等待你的可能是巨量维护开销.
虽然,这里以enum举例, 大家可能深以为然, 认为早该用个类来替换掉,
但许多时候,写的类何常不是变样的enum呢? 我是深有感触.3.冗余垃圾代码过剩.
象是这种: feetCount += Animal.Dog;
feetCount += Animal.Duck;
feetCount += Animal.Wolf;代码,是让人无法忍受的. 到也不是说我多么懒惰, 而是,3个这么写,
那么30个,300个呢? 这种代码冗余,是最浅显的.
再高一点,是函数级别的冗余,比如,一个函数内部写了段比较大小
的代码,在另一个函数内也实现了同样(或稍有差异)的代码,这也是冗余.
最高级别的冗余是,设计思想的冗余. 即系统设计的功能出现冗余.
原本相同或差异不大的功能模块,同时出现在多个模块中充分开发.冗余就要重构. 这是许多国外大师常挂在嘴边的话.可扩展性,可维护性,更好的灵活性,这些可不是嘴巴说来的,而是
用指头敲出来的. 我们当前的系统比较庞大,往往一个人设计的类
多个人同时用.然后,这个人可能再引入别人的类. 而随着项目进度,
哦,这个类还得再抽一抽. 当一个程序员,真正开始在项目中,设计基类,使用多态,才可以相信
他对面向对象,有了较好的认识.
还有下文吗?想听听你怎么用面向对象的实现方式避免“见树是树,不知有林.
”、“编码硬板”、“冗余垃圾代码过剩”这些问题(就以你说的数动物脚的问题为例子吧)。