asp.net 2.0教程 c#中的接口、抽象、委托

原创 2007年10月14日 14:52:00

尊重作者,请保留 www.it55.com 链接字样。

在学习c# 2.0的新特性以前,我们一起来看看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 类型。
   上面提及的:当你对委托实例化时,要提供一个引用函数,将其作为它构造函数的参数。
   这里要注意了:被引用的这个函数必须和委托有相同的签名。
 
   看下面的函数:
   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)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:参数个数、类型、顺序必须完全一致;返回值必须一致。

下一节我们会在本节基础上分析学习:c# 2.0新特性 泛型

 

C#使用委托进行异步编程

最近项目中需要用到异步编程,虽然以前研究过,但时间一长竟然就都忘了于是就又再重新学习了一遍…… 首先引用MSDN中的一段话来描述一下如何使用异步方式: .NET Framework 允许您异步调用任...
  • HELLO_THERE
  • HELLO_THERE
  • 2014年02月23日 23:23
  • 2020

C#中的委托与Java中的接口回调

最近因为业务需求学习起了C#,对于学过Java的人来说,C#其实还是挺好懂的,基本上很多语法都是相通的。今天就谈谈我对C#和Java中不同的地方的理解吧。   说到Java中的接口回调那么就不得不提...
  • w815878564
  • w815878564
  • 2017年02月03日 14:18
  • 1294

抽象工厂模式:实现ASP.NET访问不同数据库

在ASP.NET网站开发中可能会遇到要更换数据库,如将Aceess换为SQL Server ,由于Aceess引用System.Data.OleDb命名空间,SQL Server引用Syste...
  • judyge
  • judyge
  • 2015年05月07日 08:43
  • 350

c# 接口和抽象方法的学习

1.、接口的概念及声明1.接口只包含方法、属性、索引器、事件的签名,但不能定义常量、字段(域)、构造函数、析构函数、静态成员和接口不包含方法的实现;2.接口类似于抽象基类:继承接口的任何非抽象类型都必...
  • qq_33481237
  • qq_33481237
  • 2016年02月14日 14:07
  • 737

[深入学习C#]完成异步委托的三种方式

简介  创建线程的一个简单方式是定义一个委托,并且异步调用它。委托是方法的类型安全的引用。Delegate类还支持异步地调用方法。在后台,Delegate类会创建一个执行任务的线程。线程  线程是程序...
  • honantic
  • honantic
  • 2015年07月07日 10:22
  • 24246

Asp.net的抽象工厂模式

为什么要使用工厂模式呢?首先
  • wingahi
  • wingahi
  • 2014年05月26日 13:40
  • 1691

C# 抽象类和抽象方法详解

首先,在学习抽象方法的时候,我们必须清楚在C#中为什么会存在抽象方法,或者说为什么需要抽象方法。 我们知道,接口可以包含方法的申明和属性,但是方法中不包含代码,实现这个接口的方法必须包含接口...
  • u013180863
  • u013180863
  • 2015年09月06日 10:06
  • 999

何时使用委托而不使用接口(C# 编程指南)

重要说明 此文档可能不是当前开发最佳做法的代表,下载链接和其他资源可能不再有效。当前推荐的版本可从此处获得。 ArchiveDisclaimer 委托和接口都允许类...
  • softuse
  • softuse
  • 2016年04月28日 17:22
  • 141

【C#】C#委托和事件的实例讲解

using System; namespace delegate_event { // 定义一个猫类 class Cat { // 定义一个名字字段 private string na...
  • sinat_20559947
  • sinat_20559947
  • 2015年07月22日 15:33
  • 3964

浅析C#中抽象类和接口的区别

文章《浅析C#中接口的重要性》中讲述了如何声明和使用接口。但是C#具有abstract关键字形成的抽象类,那么二者我们该如何选择呢!C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函...
  • wangshubo1989
  • wangshubo1989
  • 2015年09月01日 09:00
  • 3402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net 2.0教程 c#中的接口、抽象、委托
举报原因:
原因补充:

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