zoukankan      html  css  js  c++  java
  • 三、抽象类和接口的对比-----《大话设计模式》

    一、抽象类

    c#允许把类和方法声明为abstract,即抽象类和抽象方法。抽象类不能实例化,抽象方法必须被子类重写,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。

    抽象类拥有尽可能多的共同代码,尽可能少的数据。

    abstract class Animal                            //加abstract关键字,表明是抽象类
    {
       ……
        protected abstract string getShoutSound();  //在方法返回值前加abstract表明此方法是抽象方法。
       ……                                           //抽象方法没有方法实体,直接在括号后加分号
      
    }

    二、接口

    接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合,一旦类实现了接口,类就可以支持接口所指定的所有属性和成员;接口的命名前面加一个大写字母“I”。

    声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式;实现接口的类必须要实现接口中的所有方法和属性。

    接口不能实例化,不能有构造方法和字段,不能有修饰符,不能声明虚拟或静态。

    interface IChange                                    //声明一个接口,此接口有一个方法
    {
          string ChangeTing(string thing);              //参数是一个字符串变量,返回一个字符串
    }
    class MachineCat:Cat,IChange                                    //可以继承父类,也可以同时继承接口,Cat这个类在前一片文章里有
    {
      public MachineCat(): base()                                   //继承自父类的构造函数       
      {
      }
      public string ChangeThing(string thing)                       //实现接口的方法,不能加override修饰符
      {
        return base.Shout() + " 我有万能的口袋,我可变出" + thing;     //调用父类Cat的方法
      }
    }
    private void button6_Click(object sender, EventArgs e)         //窗口调用        
    {
       MachineCat mcat = new MachineCat("叮噹");                   //实例化叮当猫类
    
        IChange array = new IChange(mcat);                         //将类实例赋值给接口
    
        MessageBox.Show(array.ChangeThing("各种各样的东西!"));      //实现接口方法
    
    }

    三、抽象类和接口的异同

    抽象类

    接口

    可以给出一些成员的实现,即可以包含一般方法 不能包含成员的实现,必须由实现类实现
    抽象成员可被子类部分实现 接口成员需要实现类完全实现
    一个类只能继承一个抽象类 一个类可以实现多个接口
    对类的抽象 对行为的抽象
    设计角度:从子类中发现了公共的东西,泛化出父类,然后子类继承父类 设计角度:根本不知子类的存在,方法如何实现还不确认,预先定义
    适用:对于一些相似的类对象,用继承抽象类 适用:如果行为跨越不同类的对象,可使用接口
  • 相关阅读:
    Codeforces Round #388(div 2)
    Codeforces Round #387(div 2)
    Codeforces Round #386(div 2)
    Codeforces Round #385(div 2)
    Codeforces Round #384(div 2)
    Wannafly Union Goodbye 2016
    写在2016的最后一天——给未来的自己
    2016HDU校赛
    2016BUAA校赛决赛
    codevs 1344 模拟退火
  • 原文地址:https://www.cnblogs.com/shanymen/p/4811595.html
Copyright © 2011-2022 走看看