「基础」C#中的继承,重载,委托,你真的弄明白了吗?

原创 2008年04月27日 03:50:00

虽然没什么技术含量,但也辛苦了好长时间,希望能让大家对.Net中强大的继承,重载,委托更了解一下。和那些爱好.Net师兄弟们一起快乐成长。

public partial class ClassJiCheng : System.Web.UI.Page
...{
    
//sealed class Computer:使用sealed将事先对类的密封,结果就是这个类无法被继承,密封类不能同时又是抽象类,因为抽象类总是希望被继承。
    public class Computer
    
...{
        
//protected:访问仅限包含类或从包含类派生的类型。
        
//private:访问仅限于包含类型。
        protected int _mainBoard;//定义的主板的数量(这里我们为什么没定义类型为private类型,因为我们下面将创建一个派生的类,该派生类需要访问基类的属性)。
        protected int _hardDisk;//定义硬盘的数量。
        
//定义一个事件。
        public delegate void ComputerChangHender(string s,int e);//定义一个委托。
        public event ComputerChangHender ComputerChanged;//定义一个事件。
        
//构造函数。
        public Computer()
        
...{
            _mainBoard 
= 1;
            _hardDisk 
= 2;
        }

        
public Computer(int x, int y)
        
...{
            _mainBoard 
= x;
            _hardDisk 
= y;
        }

        
public int MainBoard
        
...{
            
get ...{
                
return _mainBoard;
            }

            
set ...{
                _mainBoard 
= value;
                
string s = "_mainBoard";
                ComputerChanged(s,value);
//如果修改了这个值,将加法这个事件。
            }

        }

        
public int HardDisk
        
...{
            
get ...{
                
return _hardDisk;
            }

            
set ...{
                _hardDisk 
= value;
                
string s = "_hardDisk";
                ComputerChanged(s,value);
            }

        }

        
public string MainBoardInfo(int m)
        
...
            
switch (m)
            
...{
                
case 0:
                    
return "一块主板都没有怎么运行。";
                    
//break;用到switch时,如果return了,后面就不要习惯性的跟break了,要不然vs警告break是无法访问的代码。
                case 1:
                    
return "呵呵,电脑可以正常运行了。";
                
case 2:
                    
return "你见过两块主板的电脑吗?";
                
case 3:
                    
return "三个主板,好奇怪哦!";
                
default:
                    
return "大哥,你电脑到底有几块主板?";
            }

        }

        
    }

    
public class OldComputer : Computer //创建一个IBM电脑对象,继承与电脑。
    ...{
        
private int year;
        
private string oem;
        
public OldComputer(int ye, string oe, int m): base(888999)
        
...{
            year 
= ye;
            oem 
= oe;
            _mainBoard 
= m;
        }

        
public string OemComputer
        
...{
            
get
            
...{
                
return "这台" + oem + "电脑,它有" + _mainBoard + "个主板和" + _hardDisk + "个硬盘,它已经使用了" + year + "年了。";
            }

        }

        
public string Test()
        
...{
            
return base.MainBoard.ToString() + "," + base.HardDisk.ToString();//通过base和this访问基类成员。
        }

        
public string MainBoardInfo(string s, int m)//这里我们为子类编写了一个与基类同名的方法,但签名不同。
        ...{
            
return s + "" + m;
        }

        
public new string MainBoardInfo(int m)
        
...{
            
string c = base.MainBoardInfo(m);//这里我们使base调用基类同名的方法。
            return "父方法被覆盖,现在我们返回的是" + m + "我们调用基类同名方法的结果是:" + c;
        }

    }

    
protected void Page_Load(object sender, EventArgs e)
    
...{
        Computer c1 
= new Computer(2,2);
        c1.ComputerChanged 
+= new Computer.ComputerChangHender(c1_ComputerChanged);//注册这个事件。
        c1.MainBoard = 1;
        c1.HardDisk 
= 2;//触发了事件。

        Response.Write(
"主板有" + c1.MainBoard + ",硬盘有" + c1.HardDisk);
        Response.Write(
"<br/>调用<font color='red'>基类</font>的方法的返回是:" + c1.MainBoardInfo(3));
        Response.Write(
"<br/>--------------------上面是通过实例化了一个基类的对象,下面的代码是实例化一个子类的对象---------------------");
        OldComputer c2 
= new OldComputer(8,"Levono",20);
        Response.Write(
"<br/>" + c2.OemComputer);//Output:这台Levono电脑,它有20个主板和999个硬盘,它已经使用了8年了(这里一定要弄明白了)。
        Response.Write("<br/>子类调用父类的方法返回的是:" + c2.MainBoardInfo(2));//Output:子类调用父类的方法返回的是:父方法被覆盖,现在我们返回的是2我们调用基类同名方法的结果是:你见过两块主板的电脑吗?
        Response.Write("<br/>子类调用父类的方法返回的是" + c2.MainBoardInfo("IBM"111));//Output:子类调用父类的方法返回的是IBM,111
        Response.Write("<br/>子类调用父类的方法返回的是" + c2.Test());//Output:子类调用父类的方法返回的是20,999 。【20来自OldComputer c2 = new OldComputer(8,"Levono",20),999来自base(888,999)】。
    }

    
void c1_ComputerChanged(string s, int m)
    
...
        
if(s == "_mainBoard")
        
...{
            
switch (m)
            
...{
                
case 0:
                    Response.Write(
"没有主板,不会吧。<br/>");
                    
break;
                
case 1:
                    Response.Write(
"一个主板很正常。<br/>");
                    
break;
                
case 2:
                    Response.Write(
"两个主板,没见过。<br/>");
                    
break;
                
case 3:
                    Response.Write(
"三个主板,晕死。<br/>");
                    
break;
            }

        }

        
if (s == "_hardDisk")
        
...{
            
switch (m)
            
...{
                
case 0:
                    Response.Write(
"没有主板,你电脑运行的了吗。<br/>");
                    
break;
                
case 1:
                    Response.Write(
"就一个一个硬盘啊,少了点吧。<br/>");
                    
break;
                
case 2:
                    Response.Write(
"两个硬盘,呵呵,还可以。<br/>");
                    
break;
                
case 3:
                    Response.Write(
"三个硬盘,你真富有。<br/>");
                    
break;
            }

        }

    }

}

委托与继承

委托比继承灵活,可以动态配置,不会造成子类级数增长,另外可以通过对象的合成来实现多种功能(Decorator) 继承则相对不灵活,一旦选择了子类后,不能动态配置 委托是黑盒重用(看不到父类方法...
  • jiafu1115
  • jiafu1115
  • 2011-08-20 10:46:16
  • 1163

继承

Java不支持多重继承,是单继承,一个类只能有一个父类。1、作用域作用域当前类同一package子孙类其他packagepublic√√√√protected√√√×default(同包)√√××pr...
  • itisuptoyoua
  • itisuptoyoua
  • 2018-03-09 15:48:43
  • 14

C#中对继承、 类、虚拟、委托、事件、约束泛型等概念的运用

  • 2017年11月05日 13:33
  • 16KB
  • 下载

《大话西游》你真的看懂了吗?

前天晚上去看了《大话西游之大圣娶亲》,虽然是一部重映电影,片方又新加了11分钟新的剧情,但是每次看这部经典之作都有不同的感想。 来看一部20年经久不衰的电影《大话西游》,1994年我们看它曾经捧...
  • CC1991_
  • CC1991_
  • 2017-04-24 16:19:29
  • 1464

C++实现委托机制(一)

如果你接触过C#,你就会觉得C#中的delegate(委托)十分灵巧,它的用法上和C\C++的函数指针很像,但是却又比C\C++的函数指针更加灵活。并且委托可以一对多,也就是可以注册多个函数,甚至是某...
  • y1196645376
  • y1196645376
  • 2016-05-14 23:01:37
  • 6777

核心的东西你自己需要搞明白

如果你做一个行业,核心的知识你必须需要搞明白。 核心的搞明白了,你就称职,不然,你做再久,还是原地踏步,无实质上的进步。 比如,你如果搞金融的,那么钱就需要搞明白。每种贷款怎么算的,每个贷款方式是...
  • KuaiLeShiFu
  • KuaiLeShiFu
  • 2018-02-22 11:15:40
  • 43

[干货]让你彻底搞懂Context到底是什么,如果没弄明白,还怎么做Android开发?

详细链接:[干货]让你彻底搞懂Context到底是什么 Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Act...
  • xhmj12
  • xhmj12
  • 2016-11-23 10:42:34
  • 404

c#课件 初学者 基础篇

  • 2010年06月08日 22:01
  • 4.11MB
  • 下载

c#重写,覆盖,隐藏,重载,继承

1.重写和覆盖:在c#中这两个是一个意思,重写就是覆盖,覆盖就是重写 2.隐藏:隐藏就是子类与父类的方法一样(子类函数名前加一个new),并且子类不是虚方法,那么子类就会隐藏父类方法 3.重载:方法名...
  • qq131530624
  • qq131530624
  • 2016-09-10 10:41:05
  • 1558

关于继承机制

        假设我们的为新闻系统制作的一个类里面已经具备了数据库连接,初始化,并且有了查询、增、删、改等功能!       那接下来我们肯定要做一些不同的查询、修改等,例如新闻栏目和用户管理这两个...
  • zxpskyer
  • zxpskyer
  • 2007-07-26 21:53:00
  • 399
收藏助手
不良信息举报
您举报文章:「基础」C#中的继承,重载,委托,你真的弄明白了吗?
举报原因:
原因补充:

(最多只允许输入30个字)