您的位置:首页 > 其它

接口、抽象、委托 --------面向对象相关的一些概念

2008-07-09 15:46 330 查看
c#传统印象里的接口、抽象、委托。

1、接口是把隐式公共方法和属性组合起来,以封装特定功能的集合。接口包含诸如方法和属性定义等一系列的声明。而这些接口必须有实现接口的类来实现。

定义接口:

[存取权限] interface 接口名称

{

接口体;

}

对接口的存取权限比较常用的有public或internal。

在接口体中定义了各种各样的实现类时必须提供的代码项,但不能包含实现其成员的任何代码。接口可以定义方法、属性、索引、事件,但不包括域。

举例:所有车辆的操作都包括“Start”和"Stop",状态只有运行和非运行,我们可以使用Start()和Stop()方法来模型化这些功能,用"started"来表示车辆的运行与否。如:

public interface IDrivable

{

void Start();

void Stop();

bool started

{

get;

}

}

接口只规范started的get属性、车辆的两种操作函数,返回类型void

下面的类来实现这个接口:

public class Car : IDrivable

{

private bool _started = false;

public void Start()

{

_started = true;

}

public void Stop()

{

_started = false;

}

public bool started

{

get

{

_return started;

}

}

}

接下来,程序就可以通过实例化这个Car类来实现对车辆的操作了:

Car myCar = new Car();

myCar.Start();

2、抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

抽象类有下列特点:

声明一个抽象方法使用abstract关键字;

一个类中可以包含一个或多个抽象方法;

抽象类中可以存在非抽象的方法;

抽象类不能被直接被实例化;

实现抽象类用“:”(冒号),实现抽象方法用override关键字;

抽象类可以被抽象类所继承,结果仍是抽象类;

抽象方法被实现后,不能更改修饰符,并且在使用之前必须被重载(override)。

例如:

public abstract class Person

{

public abstract void SayHello();//抽象方法

public void about()//非抽象方法

{

Console.WriteLine("Abstract Demo");

}

}

public class Student : Person

{

public override void SayHello()//抽象方法的重载

{

Console.WriteLine("SayHello");

}

}

class MainClass

{

public static void Main()

{

new Student().SayHello();//使用重载后的类和方法

}

}

3、委托

委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。

委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数。

每一个委托都有自己的签名,例如:Delegate int SomeDelegate(string s, bool b);是一个委托申明,在这里,提及的签名,

就是说SomeDelegate 这个委托 有 string 和 bool 类型的形参,返回一个int 类型。

上面提及的:当你对委托实例化时,要提供一个引用函数,将其作为它构造函数的参数。

这里要注意了:被引用的这个函数必须和委托有相同的签名。

总结:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

看下面的函数:

private int SomeFunction(string str, bool bln){...}

你可以把这个函数传给SomeDelegate的构造函数,因为他们有相似的签名(in other words,他们都有相同的形参类型和个数,并且返回相同的数据类型)。

SomeDelegate sd = new SomeDelegate(SomeFunction);

sd 引用了 SomeFunction,也就是说,SomeFunction已被sd所登记注册,如果你调用 sd,SomeFunction 这个函数也会被调用,

记住:我所说 SomeFunction的含义,后面,我们会用到它。

委托类似于函数指针,它既能引用静态(static)方法,也能引用实例方法。

委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。

例:

using System;

namespace 委托

{

delegate int NumOpe(int a,int b); //委托声明

class Class1

{

static void Main(string[] args)

{

Class1 c1 = new Class1();#p#分页标题#e#

NumOpe p1 = new NumOpe(c1.Add); //委托实例化

Console.WriteLine(p1(1,2)); //委托调用

Console.ReadLine();

}

private int Add(int num1,int num2)

{

return(num1+num2);

}

}

}

例中,委托NumOpe引用了方法Add。

委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。

委托和所引用的方法必须保持一致:参数个数、类型、顺序必须完全一致;返回值必须一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: