C#的抽象方法

由于抽象类本身表达的是抽象的概念,因此类中的许多方法并不一定要有具体的实现,而只是留出一个接口来作为派生类重载的界面。举一个简单的例子,“图形”这个类是抽象的,它的成员方法“计算图形面积”也就没有实际的意义。面积只对“图形”的派生类比如“圆”、“三角形”这些非抽象的概念才有效,那么我们就可以把基类“图形”的成员方法“计算面积”声明为抽象的,具体的实现交给派生类通过重载来实现。

一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstract method)。

如果一个方法被声明也是抽象的,那么该方法默认也是一个虚方法。事实上,抽象方法是一个新的虚方法,它不提供具体的方法实现代码。我们知道,非虚的派生类要求通过重载为继承的虚方法提供自己的实现,而抽象方法则不包含具体的实现内容,所以方法声明的执行体中只有一个分号“;”。

只能在抽象类中声明抽象方法。对抽象方法,不能再使用static或virtual修饰符,而且方法不能有任何可执行代码,哪怕只是一对大括号中间加一个分号“{;}”都不允许出现,只需要给出方法的原型就可以了。

“交通工具”的“鸣笛”这个方法实际上是没有什么意义的,接下来我们利用抽象方法的概念继续改写汽车类的例子:

程序清单14-6:

using System;
abstruct class Vehicle //定义汽车类
{
  public int wheels; //公有成员:轮子个数
  protected float weight; //保护成员:重量
  public Vehicle(int w,float g){
     wheels=w;
     weight=g;
  }
 public abstract void Speak();
};

class Car:Vehicle //定义轿车类
{
  int passenger; //私有成员:乘客数
  public Car(int w,float g,int p):base(w,g)
  {
    wheels=w;
    weight=g;
    passengers=p;
  }
  public override void Speak(){
    Console.WriteLine("The car is speaking:Di-di!");
   }
}

class Truck:Vehicle //定义卡车类
{
  int passengers; //私有成员:乘客数
  float load; //私有成员:载重量
  public Truck(int w,float g,int p,float l):base(w,g)
  {
   wheels=w;
   weight=g;
   passengers=p;
   load=l;
  }
  public override void Speak(){
    Console.WriteLine("The truck is speaking:Ba-ba!");
   }
}

还要注意,抽象方法在派生类中不能使用base关键字来进行访问。例如,下面的代码在编译时会发生错误:

class A
{
public abstract void F();
}

class B:A
{
public override void F(){
base.F(); //错误,base.F是抽象方法
}
}
我们还可以利用抽象方法来重载基类的虚方法,这时基类中虚方法的执行代码就被“拦截”了。下面的例子说明了这一点:

class A
{
 public virtual void F(){
    Console.WriteLine("A.F");
 }
}

abstract class B:A
{
 public abstract override void F();
}

class C:B
{
 public override void F(){
  Console.WriteLine("C.F");
 }
}

类A声明了一个虚方法F,派生类B使用抽象方法重载了F,这样B的派生类C就可以重载F并提供自己的实现。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, 三角形面积计算
, 方法
, 抽象
, public
, 一个
成员
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-11-03 18:01:05

C#的抽象方法的相关文章

php中关于抽象(abstract)类和抽象方法的问题分析

 这篇文章主要介绍了php中关于抽象(abstract)类和抽象方法的问题分析,有需要的朋友可以参考一下 在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点.   什么是抽象方法?我们在类里面定义的只有方法名没有方法体的方法就是抽象方法,所谓没有方法体就是在方法声明的时候没有大括号以及其中的内容,而是直接声明时在方法名后加上分号结束,另外在声明抽象

php中关于抽象(abstract)类和抽象方法

  在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点. 什么是抽象方法?我们在类里面定义的只有方法名没有方法体的方法就是抽象方法,所谓没有方法体就是在方法声明的时候没有大括号以及其中的内容,而是直接声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字"abstract"来修饰. 1.抽象关键字 :abstract 抽象就是

java-Java抽象类中的非抽象方法的方法体为空,子类也没有头给予实现,但却被调用了是什么意思

问题描述 Java抽象类中的非抽象方法的方法体为空,子类也没有头给予实现,但却被调用了是什么意思 读源码的时候关键地方卡住了,在一个方法的结尾把数据作为参数调用了一个抽象类的方法,这个方法不是抽象方法,方法体也是空的,这个抽象类的子类只有一个,而且也没有实现这个方法,那这些数据到底了什么地方呢? 解决方案 实现方法在子类中,多态的概念,父类有这个方法(不是abstract的),所以要写一个空方法,具体实现由子类处理 解决方案二: 子类继承了父类, 不管是否重写父类的方法,都可以调用父类的方法吧

接口-调试时如何准确的查找抽象方法的实现类及方法

问题描述 调试时如何准确的查找抽象方法的实现类及方法 在开发过程中,常常会用到接口,实现其抽象方法,若在调试过程中有多个类(大约40个左右)都实现了该方法,如何准确的查找该方法并进行调试呢?求大神解答!不胜感激! 解决方案 调试的时候在调用的地方下断点,然后step into 解决方案二: 1) 查看实现接口方法的类:在接口中选中待实现的方法名称,然后右键选择 Open Implementation 即可打开实现该接口方法的类.如果有多个类则会跳出一个选择列表供选择:2) 查看实现类所实现的接口

Java语言入门教程(十五):抽象类与抽象方法

在教程(十二)中,我们有这样的假设.假设有这样一个简单需求(其实谈 不上是需求,仅仅为了初学者容易理解而编造):某培训中心要开发一个内部员 工管理系统.该培训中心目前有两个部门,技术资源部和业务部.技术资源部的 员工负责讲课,称为讲师.业务部员工负责联系洽谈业务,称为销售.在管理系 统中,需要管理的是所有员工的姓名.薪水,以及讲师的技术方向,销售的任务 量.-.. 基于这样的假设,我们设计了三个类:父类Employee.子类Sales和Trainer .如果我们有如下语句: Employee e

PHP 抽象方法与抽象类abstract关键字介绍及应用

 PHP 抽象方法与抽象类 abstract 关键字  abstract 关键字用于定义抽象方法与抽象类. 抽象方法 抽象方法指没有方法体的方法,具体就是在方法声明的时候没有 {} 括弧以及其中的内容,而是直接在声明时在方法名后加上分号结束. abstract 关键字用于定义抽象方法,语法: abstract function function_name(); 抽象类 只要一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类.抽象类同样用 abstract 关键字来定义. 抽象类不能产生实

PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)_php技巧

本文实例讲述了PHP面向对象的特性.分享给大家供大家参考,具体如下: Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //创建一个电脑类 class Computer { //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外. //public 是对字段的公有化,这个字段类外即可访问,赋值和取值 public $_name = '联想'; } $computer = new Computer();

android编程-Android编程中的抽象方法问题

问题描述 Android编程中的抽象方法问题 最近在学习Android编程,发现一个问题实在是想不通,就是android中 的抽象类里面的抽象方法被直接调用了,比如,WebSettings类中的setBuiltInZoomControls(boolean enabled).setJavaScriptEnabled(boolean flag)方法和Cursor类中的moveToFirst().isAfterLast().moveToNext()方法都可以被直接调用,这与Java的语法是矛盾的,请问

c#抽象类-C#的抽象类、抽象方法实心两个数的加减乘除问题

问题描述 C#的抽象类.抽象方法实心两个数的加减乘除问题 用C#抽象类实现 两个数的加减乘除问题 需要定义一个父类Operate,然后子类是Sum,Muli,Sub-- 希望哪位大哥帮帮忙!