【抽象类】abstract 修饰符可与类和方法一起使用
定义抽象类的目的是提供可由其子类共享的一般形式。
子类可以根据自身需要扩展抽象类。
抽象类不能实例化。
抽象方法没有函数体。
抽象方法必须在子类中给出具体实现。
在以下情况下,某个类将成为抽象类:
★ 当一个类的一个或多个方法为抽象方法时。
★ 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时。
★ 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时。

abstract class Employee {
    public int basic = 2000;
    public abstract void salary();//抽象方法
}
class Manager : Employee{
    public override void salary() {
        Console.WriteLine("薪资等于 "+basic*5);
    }
}
class Worker : Employee  {
    public override void salary() {
        Console.WriteLine("薪资等于 "+basic*2);   
    }
}
 
【抽象类和抽象方法】

  • abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以表示该类只能是其他类的基类,不能被实例化。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

    引用
    abstract class ClassOne{
        //类实现-定义抽象方法、定义抽象访问器等
    }
  • 抽象类的特性:
    • 抽象类不能实例化。
    • 抽象类可以包含抽象方法和抽象访问器。
    • 不能用 sealed修饰符修改抽象类。
    • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
  • 在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。抽象方法具有的特性:
    • 抽象方法是隐式的虚方法;只允许在抽象类中使用抽象方法声明。
    • 抽象方法声明不提供实际的实现,没有方法体;方法声明以一个分号结束,并且在签名后没有大括号 ({ })。
    • 方法实现有一个非抽象类中重写方法实现。
    • 在抽象方法声明不能使用static或virtual 修饰符。
    • 在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。
abstract class ShapesClass {
    abstract public int Area();
}
class Square : ShapesClass {
    int x, y;
    public override int Area() {
        return x * y;
    }
}

抽象类中的方法不一定都是抽象方法;抽象类也可以容纳有具体实现的方法或者称为具体方法。但是含有抽象方法的类必然是抽象类。

 
【abstract关键字】
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

abstract class ShapesClass{
    abstract public int Area();
}
class Square : ShapesClass{
    int x, y;
    // Not providing an Area method results
    // in a compile-time error.
    public override int Area(){
        return x * y;
    }
}
 
抽象类具有以下特性:

  • 抽象类不能实例化。
  • 抽象类可以包含抽象方法和抽象访问器。
  • 不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

 
抽象方法具有以下特性:

  • 抽象方法是隐式的虚方法。
  • 只允许在抽象类中使用抽象方法声明。
  • 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
    public abstract void MyMethod();
  • 实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。
  • 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

  • 在静态属性上使用 abstract 修饰符是错误的。
  • 在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

抽象类必须为所有接口成员提供实现。

 
实现接口的抽象类可以将接口方法映射到抽象方法上。
interface I {

    void M();
}
abstract class C: I {
    public abstract void M();
}
 
【虚方法与抽象方法的区别】
虚方法

  • 用virtual修饰
  • 要有方法体,哪怕是一个分号
  • 可以被子类override
  • 除了密封类外读可以重写

抽象方法

  • 用abstract修饰
  • 不允许有方法体
  • 必须被子类override
  • 只能在抽象类中

C#中的抽象类、抽象方法和虚方法的更多相关文章

  1. C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件

    一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...

  2. C#中抽象方法与虚方法的区别

    一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { ...

  3. C#中抽象方法与虚方法的区别(转)

    C#中抽象方法与虚方法的区别   一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class Peo ...

  4. OO 抽象方法与虚方法的区别

     抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不 ...

  5. C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )

    你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )   一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...

  6. 关于C#中的抽象类、抽象方法和虚方法的探究

    2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的 ...

  7. C#抽象类、抽象方法、虚方法

    定义抽象类和抽象方法: abstract 抽象类特点: 1.不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例 2.一个抽象类可以包含抽象和非抽象方法,当一个类 ...

  8. C#中的抽象方法,虚方法,接口之间的对比

    1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...

  9. C#中的抽象方法和虚方法有什么区别?

    抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了.

随机推荐

  1. LeGO-LOAM编译、运行

    LeGO-LOAM Github 地址:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM 相关依赖安装 1. ROS 2.GTSAM 下载gtsa ...

  2. 缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props。

    报错信息: 严重性 代码 说明 项目级别 文件 行 禁止显示状态 工具错误 这台计算机上缺少此项目引用的 NuGet 程序包.使用“NuGet 程序包还原”可下载这些程序包.有关更多信息,请参见 ht ...

  3. Objective-C基础教程 笔记

    一.对C的扩展 1. #import VS #include C语言使用#include语句通知编译器应在头文件中查询定义. OC中也可以使用#include,但几乎不这么用,而是使用#import. ...

  4. List Except 失效 差集失效

    https://www.cnblogs.com/benhua/p/6805192.html

  5. [转]imageMagick 在nodejs中报错Error: spawn identify ENOENT的解决方案

    同时还有 Error: Could not execute GraphicsMagick/ImageMagick 这个问题, 也参考了 https://blog.csdn.net/chenxinpen ...

  6. gevent模块学习(一)

    1.Event类,事件主要用于Greenlet之间的异步通信 e = gevent.event.Event() -> Event 说明: 创建一个信号对象 e.set() -> None ...

  7. EF Core 生成数据库

       1.运行cmd,切换到打开项目所在文件夹,输入下面的命令 dotnet ef migrations add Initial 建立并初始化数据库 dotnet ef database update ...

  8. .net实现网易云音乐下载

    客户端版的网易云音乐下载是需要vip的,网页版的虽然可以通过调试工具找到下载链接,但是用起来不是很方便,通过调试工具观察请求发现请求参数都是加密的,比如搜索歌曲的请求参数: 这个加密的实现肯定是写在j ...

  9. socket架构

    套接字基本概念 Socket是应用层与Tcp/ip协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在socket接口后面,对用 ...

  10. Django的url控制器

    一 url配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.也就是ur ...