zoukankan      html  css  js  c++  java
  • 抽象类 接口 抽象方法 虚方法【基本说明】

    首先我们说一下抽象类和接口:

    抽象类:用 abstract 修饰的类是抽象类。

    抽象类中包含的内容:抽象方法,也可以是非抽象方法,字段,属性

    【概括-仅个人之言】抽象类就是一个写来被继承的类,不能实例化,方法也不能有实现部分。继承的子类必须要实现抽象类的全部抽象方法。

    接口:用interface修饰

    接口中:方法,属性 ,【不能包含有字段】。

    接口:是用来继承的,不能实例化,继承部分必须实现接口的全部方法,还要实现该接口继承的方法(例如A接口继承自B接口,C类继承自A接     口,那么C必须实现AB两个接口的所有方法)实现的时候用public <返回值> <方法名>([参数])。

    接口和抽象类的异同

     

    相同点

    • 都不能被直接实例化,都可以通过继承实现其抽象方法。
    • 都是面向抽象编程的技术基础,实现了诸多的设计模式。

    不同点

    • 接口支持多继承;抽象类不能实现多继承。
    • 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
    • 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
    • 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
    • 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 
    • 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

    、抽象类和接口的使用:
          1、 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
          2、如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
          3、如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。  
          4、抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

    虚方法和抽象方法

    1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项。抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化。

    //抽象方法
    public abstract class Animal
    {
        public abstract void Sleep();
        public abstract void Eat();
    }

    //虚方法
    public class Animal
    {
        public virtual void Sleep(){}
        public virtual void Eat(){}
    }

    2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写。虚方法不是也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。

    public class Animal
    {
        public abstract void Sleep();
        public abstract void Eat();
    }

    这样写编译器会报错。

    3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必。抽象方法不能声明方法体,而虚拟方法可以。 包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!

    public abstract class Animal
    {
        public abstract void Sleep();
        public abstract void Eat();
    }

    public class Cat : Animal
    {
        public override void Sleep()
         {
             Console.WriteLine( "Cat is sleeping " );
         }
        // we need implement Animal.Eat() here
    }

    编译器会报错,因为我们没有实现抽象类中所有抽象方法。

    虚拟方法和抽象方法有什么区别与联系:

    1、抽象方法只有声明没有实现代码,需要在子类中实现;虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现。

    2、抽象类不能被实例化(不可以new),只能实例化实现了全部抽象方法的派生类;而包含虚方法的类可以实例化。

    3、虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。

    4、抽象方法是虚拟方法两个相像的一点是都用override重写。

                     ps:部分内容来自网络,多数都是大家总结好的,经过修改和Ctrl+C Ctrl+v完成的本文

  • 相关阅读:
    thinkinginjava学习笔记07_多态
    thinkinginjava学习笔记06_复用类
    thinkinginjava学习笔记05_访问权限
    thinkinginjava学习笔记04_初始化与清理
    thinkinginjava学习笔记03_基本语法
    thinkinginjava学习笔记02_对象
    关于药物刺激引起的突变
    通路共出现
    关于reference-free去卷积
    一些研究生期间的反思
  • 原文地址:https://www.cnblogs.com/xiaoch/p/13417965.html
Copyright © 2011-2022 走看看