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

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

先概述:

1.抽象类

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

         2.抽象方法

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

3.虚方法

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

上代码:

1.生命类   life

 public abstract class life   //抽象类
{
public string name; public abstract void live(); public abstract void death(); public virtual void birth()
{
Console.WriteLine("life类的birth()虚方法");
} public void huozhe()
{
Console.WriteLine("life类的huozhe()方法");
}
public life()
{
Console.WriteLine("life被构造");
}
}

2.动物类  animal        继承 life

 public class animal :life
{
public animal()
{
Console.WriteLine("animal被构造");
}
public string chi; //子类必须实现父类中的所有的抽象方法,即abstract的方法 public override void live()
{
Console.WriteLine( "animal类必须实现live的live()抽象方法");
}
public override void death()
{
Console.WriteLine("animal类必须实现live的death()抽象方法");
} public override void birth() //重写父类life中的虚方法用override //重写后将以实方法看待
{
Console.WriteLine("animal完成对life类中的birth()虚方法的重写");
} public new void huozhe() //覆盖父类life中的huozhe()的方法 实例化时,用该方法
{
Console.WriteLine("animal 活着");
}
}

3.人类    people   密封类      继承 animal

 //覆盖与重写的不同 在形式上
public sealed class people :animal
{
public void shuo()
{
Console.WriteLine("people中的shuo()方法");
} public people()
{
Console.WriteLine("people被构造");
}
public new void birth() //对animal完成life中的birth()虚方法进行重写后的birth()(已变为实方法)进行覆盖
{
Console.WriteLine("people中覆盖animal重写后的birth()虚方法");
}
public override void death() //people同样可以重写animal中的death的life的抽出方法的重新实现
{
Console.WriteLine("people对animal中实现life的death()抽象方法重新实现");
}
public new void huozhe() //覆盖父类animal中的huozhe()的方法 实例化时,用该方法
{
Console.WriteLine("people 活着");
}
}

4.女人类  woman        无法继承  people

开始测试

 //覆盖不会改变父类的方法   重写会改变父类的方法  当以子类创建父类的时候会体现出来
class Program
{
static void Main(string[] args)
{
people p1 =new people(); life被构造 animal被构造 people被构造
// life s1 = new life(); 作为abstract的抽象类不能被声明
animal liv1 = new animal(); //life被构造 animal被构造
animal p2 = new people(); //父类调用子类对象
liv1.death(); //输出animal 中的
liv1.huozhe(); //输出animal 中的
liv1.live(); //输出animal 中的
liv1.birth(); //输出animal 中的
Console.WriteLine("---------------------");
people p1 = new people();
p1.death(); //输出people 中的
p1.huozhe(); //输出people 中的
p1.live(); //输出继承animal 中的 //由于没有重写
p1.birth(); //输出people 中的
Console.WriteLine("---------------------");
liv1.death(); //输出animal 中的
liv1.huozhe(); //输出animal 中的
liv1.live(); //输出animal 中的
liv1.birth(); //输出animal 中的
Console.WriteLine("---------------------");
p2.death();//输出people 中的
p2.huozhe();//输出animal 中的
p2.live();//输出animal 中的
p2.birth();//输出animal中的
Console.WriteLine("-----------------------");
Console.WriteLine("---------转换----------"); // people p3 = new animal(); //出错子类引用不能直接引用父类对象, 除非将父类对象的数据类型强制转换成子类
// people p4 = (people)liv1; // 如果你创建实例的时候没有将父类引用到子类对象,是无法转换的
// p2.shuo(); //错误,引用不了, 父类引用自雷对象时无法子类中的新方法
people p5 = (people)p2; //这样转后,能调用 子类中的新方法,说明父类引用时没用丢到子类中的新方法,只是不能调用
p5.shuo();
Console.ReadKey();
}
}

测试结果

好了,细细琢磨吧!

关于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#中的抽象类、抽象方法和虚方法

    [抽象类]abstract 修饰符可与类和方法一起使用定义抽象类的目的是提供可由其子类共享的一般形式.子类可以根据自身需要扩展抽象类.抽象类不能实例化.抽象方法没有函数体.抽象方法必须在子类中给出具体 ...

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

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

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

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

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

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

随机推荐

  1. ionic开发环境搭建

    Advanced HTML5 mobile development framework and SDK. Build incredible mobile apps with web technolog ...

  2. 论 Java 中获取一组不重复的随机数之性能问题

    今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...

  3. html表格table设置边框

    对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 一般我们用表格的时候总会给它个border属性,比如:<table b ...

  4. BOM头问题

    最近有不少在微博上谈论BOM头问题,BOM头会造成页面展示的乱码,xml分析出现问题.而我恰巧遇到一种情况,在wml页面中如果加上BOM头,PC浏览器(IE,火狐)和手机浏览器(UC)都很正常,而如果 ...

  5. php错误处理和php异常处理机制

    php错误处理  当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误.  开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试  运行阶段:我们不要让程序输出任何一种错误报 ...

  6. JAVA中,数组的操作与排序

    自己写了正向反向的冒泡排序,还用了静态和NEW方法实现. import java.util.Arrays; public class HelloJava { public static void ma ...

  7. 51单片机模拟I2C总线的C语言实现

    电路原理图   EEPROM为ATMEL公司的AT24C01A.单片机为ATMEL公司的AT89C51. 软件说明 C语言为Franklin C V3.2.将源程序另存为testi2c.c,用命令 C ...

  8. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  9. Android开发 解决AlertDialog中的EditText无法调出输入法的问题

    在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题.解决方法,有两种,一是把AlertDialog换成Dialog,但这 ...

  10. MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

    1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...