C#速成(之五)全文完

原创 2003年08月29日 07:38:00

-------------------

委托

-------------------

委托让我们把一个函数引用存储在一个变量里。C++当中,这类似于使用typedef定义的函数指针,我们通常用存储一个函数指针。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

声明委托使用的关键字是 delegate。瞧瞧这个示例,你会理解什么是委托:

 

示例:

 

delegate int Operation(int val1, int val2);

public int Add(int val1, int val2)

{

    return val1 + val2;

}

public int Subtract (int val1, int val2)

{

    return val1- val2;

}

 

public void Perform()

{

    Operation Oper;

    Console.WriteLine("Enter + or - ");

    string optor = Console.ReadLine();

    Console.WriteLine("Enter 2 operands");

 

    string opnd1 = Console.ReadLine();

    string opnd2 = Console.ReadLine();

 

    int val1 = Convert.ToInt32 (opnd1);

    int val2 = Convert.ToInt32 (opnd2);

 

    if (optor == "+")

        Oper = new Operation(Add);

    else

        Oper = new Operation(Subtract);

       

    Console.WriteLine(" Result = {0}", Oper(val1, val2));

}

 

 

 

 

 

-------------------

继承和多态

-------------------

C#仅允许单继承,多继承要通过接口来实现。

 

示例:

 

class Parent{

}

 

class Child : Parent

 

 

 

 

 

-------------------

虚拟方法

-------------------

除了在子类中实现虚拟方法采用override关键字外,虚拟方法实现多态的概念C#C++相同。父类使用相同的virtual关键字。从重载虚拟方法的每个类都要使用override关键字。

 

class Shape

{

    public virtual void Draw()

    {

        Console.WriteLine("Shape.Draw")    ;

    }

}

 

class Rectangle : Shape

 

{

    public override void Draw()

    {

        Console.WriteLine("Rectangle.Draw");

    }

}

 

class Square : Rectangle

{

    public override void Draw()

    {

        Console.WriteLine("Square.Draw");

    }

}

class MainClass

{

    static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main(string[] args)

    {

        Shape[] shp = new Shape[3];

        Rectangle rect = new Rectangle();

       

        shp[0] = new Shape();

        shp[1] = rect;

        shp[2] = new Square();

 

        shp[0].Draw();

        shp[1].Draw();

        shp[2].Draw();

    }

}

 

输出t:

Shape.Draw

Rectangle.Draw

Square.Draw

 

 

 

-------------------

使用"new"来隐藏父方法

-------------------

你可以定义一个子类成一个新方法版本,隐藏基类当中的那个版本。使用new关键字就可以定义一个新版本。思考下面的示例,它是上面示例的修改后的版本。注意当我用Rectangle类中的new关键字代替override关键字时示例的输出情况。

 

class Shape

{

    public virtual void Draw()

    {

        Console.WriteLine("Shape.Draw")    ;

    }

}

 

class Rectangle : Shape

{

    public new void Draw()

    {

        Console.WriteLine("Rectangle.Draw");

    }

}

class Square : Rectangle

{

    //没在这里让你重载

    public new void Draw()

    {

        Console.WriteLine("Square.Draw");

    }

}

class MainClass

{

    static void Main(string[] args)

    {

        Console.WriteLine("Using Polymorphism:");

        Shape[] shp = new Shape[3];

        Rectangle rect = new Rectangle();

 

        shp[0] = new Shape();

        shp[1] = rect;

        shp[2] = new Square();

 

        shp[0].Draw();

        shp[1].Draw();

        shp[2].Draw();

 

        Console.WriteLine("Using without Polymorphism:");

        rect.Draw();

        Square sqr = new Square();

        sqr.Draw();

    }

}

 

输出:

Using Polymorphism

Shape.Draw

Shape.Draw

Shape.Draw

Using without Polymorphism:

Rectangle.Draw

Square.Draw

 

这里的多态性不会把Rectangle类的Draw方法当做ShapeDraw方法多态性的一种表现。相反,它会认为这是一种不同的方法。因此,为了避免父类与子类间的命名冲突,我们使用了new修饰符。

 

注意:你不能使用同一类下面一种方法的两个版本,即一个是用new修饰符的版本,另一个是用overridevirtual修饰符的版本。正象上面示例所说明的,我不能再在拥有virtualoverride方法的Rectangle类中添加另一个命名为Draw的方法。同样地,在Square类中,我也不能重载Square类的虚拟的Draw方法。

 

 

 

 

 

-------------------

调用基类成员

-------------------

如果子类与基类有同名的数据成员,为避免命名冲突,访问基类数据成员和函要使用一个关键字base。在下面的示例中我们来看看如何调用基类的构造函数以及如何使用数据成员。

 

public Child(int val) :base(val)

{

    myVar = 5;

    base.myVar;

}

 

或者

 

public Child(int val)

{

    base(val);

    myVar = 5 ;

    base.myVar;

}

 

 

 

--------------------------------

将来的补充:

本文仅是一个C#语言的快速概览,以便你能熟悉此语言的特点。虽然我已经尽力以简明而全面的代码例示方式讨论所有主要的C#概念,我认为要填加讨论的还有很多。

 

将来我会加入更多还没有讨论的命令和概念,比如事件等等。我也想写些有关C#初学者进行Windows编程的东东。

 

参考资料:

our most commonly known MSDN

Inside C# by Tom Archer

A Programmer's Introduction to C# by Eric Gunnerson

Beginning C# by Karli Watson

Programming C# (O'Reilly)

 

About the Author

Aisha is a Master of Science in Computer Science from Quaid-i-Azam Univeristy. She has worked in VC++ 6, MFC, ATL, COM/DCOM, ActiveX, C++, SQL, and so forth. These days she is working on .NET framework and C#. Inspired with nature, she loves to seek knowledge. She is also fond of travelling. She keeps a free source code and articles Web site at http://aishai.netfirms.com.

 

History

Date Posted: June 13, 2003

C#速成(之五)全文完

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 11:33
  • 96

C语言速成手册(五):其它运算符、文件操作、其它函数

条件运算符    条件运算符的格式如下:表达式1 ? 表达式2 : 表达式3    它表示:若表达式1为真(非0),则返回表达式2,否则返回表达式3。    下面的函数返回两个数中较小的一个:l...
  • matrix67
  • matrix67
  • 2007年06月17日 07:05
  • 500

【恶补】之python一天速成

python一天速成都是骗纸~怎么可能一天~只是快速了解一些基本的 首先我是个python新手,只在网上搜例子然后用python写过一些分析文件的脚本,现在工作需要,要短时间进一步了解pyth...
  • u013207660
  • u013207660
  • 2014年08月20日 16:17
  • 3870

数据结构实验之栈与队列五:下一较大值(一)

Problem Description 对于包含n(1
  • gx17864373822
  • gx17864373822
  • 2017年10月09日 22:41
  • 176

JAVA基础18天速成学习笔记之第10天

JAVA基础18天速成学习笔记之第10天 这是我在csdn下载的.觉得有助于复习Java所以贴了出来.感谢作者.下面附有下载地址. http://download.csdn.net/detail/...
  • thanklife
  • thanklife
  • 2013年11月08日 10:47
  • 1120

SDUTOJ 2120数据结构实验之链表五:单链表的拆分

#include #include using namespace std; typedef int ElemType; typedef struct LNode { ElemType data; ...
  • R_Misaya
  • R_Misaya
  • 2014年10月06日 13:43
  • 702

数据结构实验之查找五:平方之哈希表

数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory limit: 65536K 题目描述 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应...
  • Code_KK
  • Code_KK
  • 2015年12月04日 23:28
  • 1066

3377 数据结构实验之查找五:平方之哈希表

数据结构实验之查找五:平方之哈希表#include using namespace std; int main() { int Hash[550]; int n,k;...
  • yue_luo_
  • yue_luo_
  • 2016年12月11日 21:23
  • 98

SDUT 数据结构实验之查找七:线性之哈希表

数据结构实验之查找七:线性之哈希表  Time Limit: 1000MS Memory limit: 65536K  题目描述 根据给定的一系列整数关键字和素数p,用除留余数法定义...
  • jinshiyan1995
  • jinshiyan1995
  • 2015年12月20日 20:46
  • 286

(转)驱动开发之五 --- TDI之一 【译文】

http://hi.baidu.com/combojiang/item/635f7c0d3b3c2b14addc700e 理论:   本篇的题目有点容易让人误解。出于演示目的,我们写一个T...
  • jiangqin115
  • jiangqin115
  • 2015年11月10日 14:16
  • 489
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#速成(之五)全文完
举报原因:
原因补充:

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