zoukankan      html  css  js  c++  java
  • asp.net 2.0教程 c#中的接口、抽象、委托

    尊重作者,请保留 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新特性 泛型

  • 相关阅读:
    深入解析Hibernate核心接口
    Hibernate基本原理
    深入hibernate的三种状态
    Hibernate commit() 和flush() 的区别
    Hibernate中的merge使用详情解说
    Record is locked by another user
    Vue路由router-link的使用
    Vue-router的基本使用
    Vue把父组件的方法传递给子组件调用(评论列表例子)
    Vue中子组件调用父组件的方法
  • 原文地址:https://www.cnblogs.com/bk/p/917007.html
Copyright © 2011-2022 走看看