zoukankan      html  css  js  c++  java
  • 【框架设计】什么是框架的接口

       什么是框架的接口

    概述:   接口,对于大家都不陌生,至于何时使用,怎么使用?这里举一个例子:假如一个类A,负责传输数据。而类B,恰好是接收数据。我们还需要一个类C用来接收和传输数据。那么怎么样让A类和B类继承C呢?有的编程语言,允许多继承。子类可以继承多个父类。但是在C#中,定义不能多继承,但是可以使用多个接口。那么要继承接口就需要interface定义它ID,内部可以封装方法,但是注意,倘若你要继承ID接口,那么接口内部的所有方法属性都要实现。说到此处,不免有人问:“接口和父类继承有何区别?”.一般是泛类中的个体,即is--a的关系使用继承。如:狗是动物的一种可以使用,Class 狗:动物而接口强调是对象具有某种能力,即can--do的关系使用接口。如:大雁会飞,Class 大雁:I飞C#定义子类不许继承多个类,但是可以多个接口。如:唐老鸭是动物,它会说话,会游泳,Class 唐老鸭:动物,I说话,I游泳

    C#基础系列导航


    1. C#实现队列读写操作(一)
    2. 变化多端的列表(二)
    3. VS自动内存管理(垃圾回收集)(三)
    4. C#忽略基础知识点梳理(四)
    5. 什么是框架的接口(五)
    6. 程序集的加载与反射(六)
    7. CLR寄宿和应用程序域(七)
    8. 异常(八)

    类和接口继承问题:

          System.Object类是所有类的根类,它定义的四个方法:ToString,Equals,CetHashCode,GetType适用于任何类。所有继承Object类的类实际继承的是方法签名base()和具体实现。

          接口:实际上是为一组方法签名,指定一个方法名,不加以方法的实现。可以被多个类来继承,可以定义事件,方法,参数/无参属性。不许定义构造器方法和实例字段。提供接口必须实行所有接口中的方法。具有can--do的关系。

    CLR要求接口方法标记Virtual。这样才能被派生类重写。如果不标记,默认Virtual和Sealed,阻止派生类重写方法接口。

     

    接口方法隐式和显示实现:实例解析

    接口:

    internal sealed class SimpleType : IDisposable
        {
            //接口方法的隐式实现
           public void Dispose()
           {
               Console.WriteLine("隐式 Dispoable");
           }
            //接口方法的显式实现
           void IDisposable.Dispose()
            {
    
                Console.WriteLine("显式 Dispoable");
            }
        }

    实现:

    static void Main(string[] args)
            {
                SimpleType st = new SimpleType();
                st.Dispose();
                IDisposable d = st;
                d.Dispose();
                Console.ReadLine();
            }

    结果:


    泛型接口问题:

    IComparable<T>有一下几个好处:

    1,编译时安全,可以有任意类型,若有异常通过Object类抛出。

    2,操作值类型时候,不需要太多装箱,也正是比非泛型接口优化之处。性能提高。

    3,可以根据参数T不同使用同一个接口若干次。代码冗杂性小,可读性高。性能提升。


    对基类和接口操作的实例运用:

          描述:有一个动物类,它可以派生出多个类。并且其中一个类既要实现继承又要实现接口。在控制台程序编写并输出此派生类的所有方法。

    基类派生多个类,并且其中一类继承接口

        //基类
        public abstract   class Base
        {
            public abstract void Animal();
        }
        //派生类,继承基类和接口
        public  class  Brid:Base,Interface1
        {
            public override void Animal()
            {
                Console.WriteLine("我是大雁!");
            }
            public void Fly()
            {
                Console.WriteLine("我会飞!");
            }
            public void Say()
            {
                Console.WriteLine("我会说话!");
            }
            
        }
        //派生类
        public class Brid1 : Base
        {
            public override void Animal()
            {
                Console.WriteLine("我是笨笨鸟!");
            }
        }
    

      

    接口的定义

         interface Interface1
        {
             void Fly();
             void Say(); 
        }
    

      

    客户端调用:

            static void Main(string[] args)
            {
                Brid b1 = new Brid();
                b1.Animal();
                Interface1 d = b1;
                d.Fly();
                d.Say();
                Console.ReadKey();
             }
    

      

    输出结果

     

    补充:抽象类和接口多态关系实例

         之前对接口做了总结,应园友需求,今天总结一下接口和抽象类的基础知识,用小的例子演示更容易理解。在演示之前我们还是把原理核心的区别了解下

    相同点:

    接口和抽象类都可以由子类继承的抽象成员(就是可以声明定义方法等但是不负责具体实现),接口和抽象类都不能实例化。

    不同点:

    接口所拥有的成员都是抽象成员,而抽象类既可以有抽象成员也可以有非抽象成员。(下面例子中,抽象类定义抽象方法和一般非抽象方法演示)

    抽象类可以public和internal,但是接口一般都是public的

    抽象类包含构造函数,析构函数,静态成员和常量,恰恰接口不能包含这些。

    类或者抽象类只能单继承,接口可以多继承


    下面描述实例的思想流程:

          什么是抽象类呢?我开始想到对象是动物,后来发现动物实例大家比较熟悉。就改变门门对象即抽象类。抽象类里面有什么?我想有个抽象方法,这个跟接口一样。就在找个不一样的构造方法,还要一个抽象属性。抽象类完成了。下面继承的子类就应该是具体的了,门有很多种,我选择木门。木门中拥有抽象属性和方法的重载(就是具体属性和方法实现)。

    这时候门可能还有玻璃门,铁门,金门等。这样就可以多个子类(不同材料门)继承父类(门),这就是传说的多态。下面缺接口,什么接口?之前我就说是can--do关系。我定义一个锁的接口,也可以有门铃接口。我把门铃放在锁类吧。听到门铃去开锁(开门)。这样让子类(各种材料门)继承门和锁。实现了子类继承接口和父类。多个这样类实现多态。

    然后,客户端实例化两种方法。一种对子类实例(这样实例接口时候可以将子类对象附给接口),也可以实例父类(new 子类)。

    综述:

            就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。


    接口源码:

        public interface Isuo//I锁
        {
            void MenLing();//门铃
        }
    

     抽象类实现继承和多态:

    public abstract class 门
        {
            protected string name;
            //抽象属性
            public abstract string Name
            {
                get;
            }
            //抽象方法
            public abstract void Open();
            //一般方法
            public void Price()
            {
                Console.WriteLine("我的门,价格好高!");
            }
        }
    
        
    
        //继承和多态
        public class 木门 : 门, Isuo
        {
            public 木门(string myname)  
            {   
                name = myname;
            } 
            
            //重载抽象属性    
            public override string Name
            {
                get { return name; }
            }
            //重载抽象方法 
            public override void Open()
            {
                Console.WriteLine(name + " 是最经济在!");
            }   
            //实现接口方法 
    
            public void MenLing()
            {
                Console.WriteLine("我是木门的门铃!");
            }
        }
    
        public class 铁门 : 门, Isuo
        {
            public 铁门(string myname)
            {
                name = myname;
            }
    
            //重载抽象属性    
            public override string Name
            {
                get { return name; }
            }
            //重载抽象方法 
            public override void Open()
            {
                Console.WriteLine(name + " 是结实的!");
            }
            //实现接口方法   
            public void MenLing()
            {
                Console.WriteLine("我是铁门的门铃!");
            }
        }
    

    客户端实现

    static void Main(string[] args)
            {
                木门 men = new 木门("木门");
                men.Open();
                men.Price();
                门 men1 = new 木门("铁门");
                men1.Open();
                men1.Price();
    
                Isuo s = men;
                s.MenLing();
                Console.Read();
            }
    

     运行结果:


    总结:

          到此接口基本定义和方法已经结束,以及使用的定义。接口多是起着内部方法的作用,有不同于类。在编程中会给你带来更多的便利和惊喜。

     

  • 相关阅读:
    2019.6.20刷题统计
    36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量
    35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型
    34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程
    33 udp 域名 进程
    32 粘包 文件传输
    31 socket客户端. 服务器 异常 语法
    30 网络编程
    29 元类 异常
    26 封装 反射 常用内置函数
  • 原文地址:https://www.cnblogs.com/baiboy/p/c5.html
Copyright © 2011-2022 走看看