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

2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了。

在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的成员也是丰富多彩。

先概述:

1.抽象类

抽象类中不是所有的方法都是抽象方法,对于单纯抽象类而言,是限制类的实例化,可以没有抽象方法。甚至没有任何成员也没事。

         2.抽象方法

            抽象方法的目的是为了让派生类实现其方法,抽象的方法不实现,抽象方法没有方法体,没有大括号。包含抽象方法的类一定是抽象类,所以含有抽象方法(属性)是这个类是抽象类的充分非必要条件。

3.虚方法

            虚方法是一种方法,不是抽象的,它有大括号,是实现的,子类可以重写,可以覆盖。虚方法是父类中不一定继承到子类中的,具体由子类决定,它与抽象方法不同,虚方法与一般的方法相比,可实现由子类选择是否继承。

上代码:

1.生命类   life

 1 public abstract class life   //抽象类
 2     {
 3         public string name;
 4
 5         public abstract void live();
 6
 7         public abstract void death();
 8
 9         public virtual void birth()
10         {
11             Console.WriteLine("life类的birth()虚方法");
12         }
13
14         public void huozhe()
15         {
16             Console.WriteLine("life类的huozhe()方法");
17         }
18         public life()
19         {
20             Console.WriteLine("life被构造");
21         }
22     }

2.动物类  animal        继承 life

 1 public class animal :life
 2     {
 3        public animal()
 4        {
 5            Console.WriteLine("animal被构造");
 6        }
 7          public string chi;
 8
 9        //子类必须实现父类中的所有的抽象方法,即abstract的方法
10
11           public override void live()
12         {
13            Console.WriteLine( "animal类必须实现live的live()抽象方法");
14         }
15           public override void death()
16           {
17               Console.WriteLine("animal类必须实现live的death()抽象方法");
18           }
19
20           public override  void birth()  //重写父类life中的虚方法用override  //重写后将以实方法看待
21           {
22               Console.WriteLine("animal完成对life类中的birth()虚方法的重写");
23           }
24
25           public new void huozhe()   //覆盖父类life中的huozhe()的方法 实例化时,用该方法
26           {
27               Console.WriteLine("animal 活着");
28           }
29     }

3.人类    people   密封类      继承 animal

 1 //覆盖与重写的不同 在形式上
 2     public sealed class people :animal
 3     {
 4         public void shuo()
 5         {
 6             Console.WriteLine("people中的shuo()方法");
 7         }
 8
 9         public people()
10         {
11             Console.WriteLine("people被构造");
12         }
13         public new void birth()  //对animal完成life中的birth()虚方法进行重写后的birth()(已变为实方法)进行覆盖
14         {
15             Console.WriteLine("people中覆盖animal重写后的birth()虚方法");
16         }
17         public override void death() //people同样可以重写animal中的death的life的抽出方法的重新实现
18         {
19             Console.WriteLine("people对animal中实现life的death()抽象方法重新实现");
20         }
21         public new void huozhe()   //覆盖父类animal中的huozhe()的方法 实例化时,用该方法
22         {
23             Console.WriteLine("people 活着");
24         }
25     }

4.女人类  woman        无法继承  people

开始测试

 1 //覆盖不会改变父类的方法   重写会改变父类的方法  当以子类创建父类的时候会体现出来
 2     class Program
 3     {
 4         static void Main(string[] args)
 5         {
 6             people p1 =new people();   life被构造  animal被构造   people被构造
 7           //  life s1 = new life();   作为abstract的抽象类不能被声明
 8             animal liv1 = new animal();     //life被构造  animal被构造
 9             animal p2 = new people();    //父类调用子类对象
10             liv1.death();  //输出animal 中的
11             liv1.huozhe();  //输出animal 中的
12             liv1.live();   //输出animal 中的
13             liv1.birth();  //输出animal 中的
14             Console.WriteLine("---------------------");
15             people p1 = new people();
16             p1.death();   //输出people 中的
17             p1.huozhe();  //输出people 中的
18             p1.live();    //输出继承animal 中的  //由于没有重写
19             p1.birth();    //输出people 中的
20             Console.WriteLine("---------------------");
21             liv1.death();   //输出animal 中的
22             liv1.huozhe();  //输出animal 中的
23             liv1.live();   //输出animal 中的
24             liv1.birth();  //输出animal 中的
25             Console.WriteLine("---------------------");
26             p2.death();//输出people 中的
27             p2.huozhe();//输出animal 中的
28             p2.live();//输出animal 中的
29             p2.birth();//输出animal中的
30             Console.WriteLine("-----------------------");
31             Console.WriteLine("---------转换----------");
32
33
34            //  people p3 = new animal();  //出错子类引用不能直接引用父类对象,  除非将父类对象的数据类型强制转换成子类
35            // people p4 = (people)liv1; // 如果你创建实例的时候没有将父类引用到子类对象,是无法转换的
36             //  p2.shuo();          //错误,引用不了, 父类引用自雷对象时无法子类中的新方法
37             people p5 = (people)p2;   //这样转后,能调用 子类中的新方法,说明父类引用时没用丢到子类中的新方法,只是不能调用
38             p5.shuo();
39             Console.ReadKey();
40         }
41     }

测试结果

好了,细细琢磨吧!

时间: 2024-11-05 02:33:45

关于C#中的抽象类、抽象方法和虚方法的探究的相关文章

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

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

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { public abstract void study();  //抽象方法只能定义在抽象类中. } public class Student:People   //继承抽象类 { public  override void study()     //重写抽象类的抽象方法 { Console.Wr

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

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

抽象方法和虚方法 与设计模式

一.概念 抽象方法和虚方法是什么?先写一段代码看看他们俩的区别. 抽象方法使用abstract关键字:虚方法使用virtaul关键字. <span style="font-size:18px;">//抽象方法 Public abstract class TestPaper { Public abstract Answer(): } </span> <span style="font-size:18px;">//虚方法 Public

C# 抽象方法和虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. (1)象方法只能声明在抽象类中,使用关键字abstract (2)抽象类中的抽象方法必须被子类重写. [抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法] 二.虚方法:使用virtual修饰的方法: 虚方法可以有方法体. 注意事项:virtual修饰符不能与private.static.abstract.override修饰符同时使用. ps:override

虚方法的重写与普通方法的隐藏的区别;抽象方法和虚方法有什么区别?

两者都可实现对基类方法的重写 ,虚方法在基类中virtual ,在派生类用override关键字修饰,而普通方法的隐藏在基类不用什么修饰符,而在派生类中用new关键字进行重写 ,我想问,它们同样是方法的重写, c#为什么会有两种方法重写方法,这样设计不是重复了呢, 这怎么理解呢? 不重复,首先如果基类里面的virtual方法被子类继承之后,用override重写之后,那么子类里面就只有一个该方法名的方法了.而另一个普通的,就是在子类里面直接通过new 来新建一个方法那叫重载(多态分为重写和重载)

C#中的抽象类、抽象方法和虚方法

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

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

接口、抽象类、抽象方法、虚方法总结

一.接口 1.定义 1.1.访问修饰符 interface 接口名{成员可以为属性.方法.事件.索引器} 1.2.示例代码 public delegate void DelInfo(int Id); public interface IInformation { //属性 int Id { get; set; } int[] ArrayInt { get; set; } //方法 void IGetInfo(); //事件 event DelInfo IDelInfo; //索引器 long t