【抽象类】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. 学号 20175212 《Java程序设计》第3周学习总结

    学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...

  2. idea 中add configuration

    记住:点击“+”号配置tomcat 第一步当然先得建一个web项目 1.file -> new -> project -Next -> Finish -项目建好了接下来就是配置了 - ...

  3. Qt 滚动窗口类

    { QScrollArea *scrollArea = new QScrollArea(this); scrollArea->setFrameStyle(); scrollArea->se ...

  4. 《程序设计入门——C语言》翁恺老师 第一周编程练习记录

    1 输出“Hello World”(5分) 题目内容: 请输出一行,内容为 Hello World 请注意大小写. 由于这一周只是简单地介绍了C程序的基本框架,还不能做很多事情,甚至还不能做数据的输入 ...

  5. 如何更有效地说服开发接收你的bug?!

    来来来,测试小伙伴们,看看以下这张图是不是觉得很熟悉.. 虽然这张图带点戏谑的成分,但确实折射出大部分IT公司测试人员在报bug时,与开发的沟通存在些许问题.如何更有效地说服开发接收你的bug,以下整 ...

  6. 2018网站Https升级完全攻略

    这篇文章主要讲下HTTPs升级的全部流程,包括SSL/TLS证书获取,证书安装,网站调试(将站内http资源全部改为https+重定向等),升级成功后向谷歌webmaster和GA的重新提交新的网站. ...

  7. @Dependson注解与@ConditionalOnBean注解的区别

    @Dependson注解是在另外一个实例创建之后才创建当前实例,也就是,最终两个实例都会创建,只是顺序不一样 @ConditionalOnBean注解是只有当另外一个实例存在时,才创建,否则不创建,也 ...

  8. java——形参与实参

    看了很多的文章,稍微有一些的总结:对最基本的形参与实参有了一定的理解,虽然还是不够深入. 1.基本概念 形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接 ...

  9. 深入java----java内存区域及对象的创建

    看完深入理解jvm之后自己再用图的方式进行一遍梳理,用以加深理解. 第一部分,首先对整体java运行时内存区域有一个整体框架式的了解. 运行时内存区域的划分如上图所示,那么接下里看看一个对象的创建又怎 ...

  10. DevExpress ASP.NET Core Controls 2019发展蓝图(No.3)

    本文主要为大家介绍DevExpress ASP.NET Core Controls 2019年的官方发展蓝图,更多精彩内容欢迎持续收藏关注哦~ [DevExpress ASP.NET Controls ...