zoukankan      html  css  js  c++  java
  • c#学习历程4

    内容主要包括两大主题:接口和委托

    一.接口

    接口定义:把一组方法声明进行统一的命名,但是这些方法没有实现(和纯虚函数类似,只声明方法,不能实例,只能被继承)

    格式:interface 接口名字
      {
        声明方法
      }

    注意:1.接口不需访问权限,默认为公有
               2.使用时不能单独使用,只能被继承(可由类或结构体实现)
             3.接口没有字段,运算符重载,实例构造函数,析构函数,只有方法(  属性 事件  索引器)
               4.接口不能给你使用static关键值,方法只能是普通方法不能加static

        interface MyInterface{
        //只能被重写 不能被调用 类似抽象方法  不需写访问权限  默认为公有
            void print();
        }

        interface Interface
        {
            void print();
        }


    继承接口:如果想继承接口那么必须实现接口中定义的所有方法

    class MyClass:MyInterface
        {
            
            public void print()
            {
                Console.WriteLine ("MyClass");
            }

         }
    多继承的问题
    当多个接口包含相同方法的时候,如果都实现的话,就会发生冲突,系统不知道调用哪一个

    解决方法:1.同时实现多个方法(隐式实现) 2.加上对象.来区分开方法(显式的实现)

    1.只写一个方法实现来实现所有接口的方法
    class MyClass:MyInterface,Interface
        {
            // 不加访问权限  默认为私有
            //当多个接口有共同的方法时
            //不分开隐式实现(推荐)(2个接口方法  同时实现)
            public void print()
            {
                Console.WriteLine ("MyClass");
            }

    2.
    class MyClass:MyInterface,Interface
       
    //分开的显示实现(还需要强制类型转换)不加任何访问修饰符 默认为私有
            void MyInterface.print()
            {
                Console.WriteLine ("MyInterface");
            }

            void Interface.print()
            {
                Console.WriteLine ("Interface");
            }

    使用显式接口实现方式时,需要注意几个问题

    1.若显式实现接口,方法不能使用任何访问修饰符。

      显式实现的成员默认为私有。

    2.显式实现的成员默认是私有的,所以这些成员不能通过对象

      直接访问。此时正确的访问方式就是把对象显式的转换为对应的接口,通过接口来调用该方法。

      MyClass mc = new MyClass();

      MyInterface mc1 = (MyInterface)mc;
      mc1.print ();

    3.当类实现单个接口时,通常使用隐式接口方式,因为对象可以直接访问接口方法。

    4.实现多个接口时候,一般推荐使用显式的方式。 


    接口经常与抽象类一起使用,共同服务于面向对象的编程

    单分析一下区别: 

    1.抽象类使用abstract关键字进行定义,接口使用interface进

      行定义,它们都不能实例化

    2.抽象类可以包含虚方法、非抽象方法和静态成员;但接口不

      能包含虚方法和任何静态成员,并且接口中只能定义方法,不能有具
      体实现。
    

    3.抽象类不能实现多继承,接口支持多继承。

    4:抽象类本质是一个类;接口只是代表实现类具有接口声明的方法,是一种CAN—DO关系。 



    二.委托

    委托就是把一些方法包装成了一个对象来使用

    委托的步骤:1.定义委托类型 2.声明委托变量 3.实例化委托 4.作为参数传递 5.调用委托

    1.有一个方法的委托

    class MainClass{

    //1:
声明委托
    delegate void MyDelegate(int para1,int para2);

    public static void Main (string[] args)

    {

      //2:
定义委托变量

      MyDelegate d;

      //3:
实例化委托(添加方法)

      d = new MyDelegate (new MainClass().Add);

      //4:
调用

      MyMethod (d);
      Console.WriteLine ("Hello World!");

    }

    void Add(int a,int b)

    {

      int sum = a + b;

      Console.WriteLine (""+sum);

    }

    private static void MyMethod(MyDelegate myDelegate)
    {
 
    

      //5:
方法中调用委托

      myDelegate (1,2);

    }

    }
 

    委托的优点:

    引入委托之后,我们可以把函数作为参数传递给另外一个方法了。委托可以提高方法扩展性。

    
 

    2.委托链

    class MainClass
        {
            public delegate void delegateTest();

            private static void method1(){
                Console.WriteLine ("这是静态方法1");
            }
            private void method2(){
                Console.WriteLine ("这是实例方法2");
            }
            private void method3(){
                Console.WriteLine ("这是实例方法3");
            }
            static void Main(string[] args){
                MainClass p=new MainClass();
                delegateTest d1 = new delegateTest (MainClass.method1);
    //          delegateTest d1 = MainClass.method1;//简写
                delegateTest d2 = new delegateTest (p.method2);
                delegateTest d3 = p.method3;//简写
                delegateTest delechain = null;
                delechain += d1;
                delechain += d2;
                delechain += d3;
                //移除委托
                delechain -= d1;
                delechain ();

    特别注意 :  //转向直接发生改变,直接指向d3
                delechain = d3;//只输出为d3的方法
                delechain ();

            }
        }




  • 相关阅读:
    LeetCode: Reverse Words in a String && Rotate Array
    LeetCode: Maximum Product Subarray && Maximum Subarray &子序列相关
    =new、=null、.clear()、system.gc()的区别
    对象转字符串的效率问题
    Java遍历Map对象的四种方式
    JDK升级
    eclipse的任务列表
    统一修改数据库表名字段大小写
    get传数组
    vue编辑回显问题
  • 原文地址:https://www.cnblogs.com/shuaigezhaoguang/p/5869752.html
Copyright © 2011-2022 走看看