【框架设计】什么是框架的接口

news/2024/7/20 14:02:41 标签: c#, 内存管理

   什么是框架的接口

概述:   接口,对于大家都不陌生,至于何时使用,怎么使用?这里举一个例子:假如一个类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();
        }

 运行结果:

 


总结:

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

 

转载于:https://www.cnblogs.com/baiboy/archive/2013/03/19/c5.html


http://www.niftyadmin.cn/n/1512284.html

相关文章

数据结构-冒泡排序

冒泡排序的思想&#xff1a;依次比较相邻的两个数&#xff0c;将小数放在前面&#xff0c;大数放在后面。即在第一趟&#xff1a;首先比较第1个和第2个数&#xff0c;将小数放前&#xff0c;大数放后。然后比较第2个数和第3个数&#xff0c;将小数放前&#xff0c;大数放后&…

小白学数据分析-----什么是DAU_II [玩家粘性分析模型]为什么游戏粘性会达到60%...

一直以来&#xff0c;我们很重视新登用户的研究&#xff0c;为此&#xff0c;我们设计了留存&#xff08;retention&#xff09;这个概念&#xff0c;有关于这个概念&#xff0c;之前我说了很多&#xff0c;研究了很多&#xff0c;当然写出来的只是一部分&#xff0c;在后续针对…

【转】雷军 程序员随想

我不是天生的程序员&#xff0c;也并非天生就喜欢电脑&#xff0c;上高中时也没有想过将来会当程序员&#xff0c;接触电脑纯属偶然&#xff0d;&#xff0d;小时候的一个好朋友上大学时选择了电脑专业&#xff0c;为了和这个朋友有更多的“共同语言”我便选择了计算机系。在大…

Aptana使用技巧—Aptana2.0系列教程

转载&#xff1a;http://www.36ria.com/3217 关于Aptana2.0的使用&#xff0c;明河之前已经介绍不少了&#xff0c;今天这篇教程将作为Aptana2.0系列教程的完结篇&#xff0c;明河主要介绍一些Aptana2.0一些使用技巧。 备注&#xff1a;Aptana3.0测试版已经面世了&#xff0c;但…

Android 源代码结构

简介 在使用Andriod SDK进行应用程序开发的时候&#xff0c;我们需要对源代码进行调试&#xff0c;有可能需要进入到某个Android API函数内部进行跟踪调试。但是&#xff0c;如果目标版本的SDK没有关联对应版本的源代码的话&#xff0c;就会提示你找不到源代码。 图&#xff1a…

oracle 执行计划 咬文嚼字

http://lzfhope.blog.163.com/blog/static/6363992201182411314849/?suggestedreading&wumii Oracle几个读的原理和区别 2011-09-24 23:03:14| 分类&#xff1a; ORACLE性能 | 标签&#xff1a;oracle 性能 |字号大中小 订阅 有位仁兄做了比较透彻的分析&#xff0…

SCVMM 2012 SP1 安装

SCVMM 2012 作为微软企业级的虚拟化和云计算管理平台&#xff0c;兼容 Citrix XenServer&#xff0c;VMware vSphere&#xff0c;同时重点着力于为企业构建私有云和服务&#xff0c;功能强大&#xff0c;亮点很多。同时对于即将上市的windows server 2012&#xff0c;微软大肆宣…

二叉树的遍历 - 数据结构和算法46

二叉树的遍历 让编程改变世界 Change the world by program 二叉树的遍历(traversing binary tree)是指从根结点出发&#xff0c;按照某种次序依次访问二叉树中所有结点&#xff0c;使得每个结点被访问一次且仅被访问一次。 这里有两个关键词小甲鱼给加红了&#xff1a;次序和…