每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心,他们常常一个人宅在家中!有上进心的,查查资料,学习新的知识,没上进心的,在家一日重复一日的打游戏!

以上发自苦逼程序猿的心声......

当然,题外话说多了,咱进入正题!

在C#的学习中,容易混淆virtual方法和abstract方法以及C#接口的使用,现在来讨论一下三者的区别。前两者都牵涉到在派生类中与override的配合使用。

一、Virtual方法(虚方法)

virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:

情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

二、Abstract方法(抽象方法)

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。请务必将抽象方法放在抽象类中。派生类必须全部实现父类的方法。

三、Interface:接口中的方法没有具体实现,也就是没有方法体,必须由继承者去实现而且必须全部实现。

下面写了几个类进行详细说明(可直接复制粘贴到自己的项目中去实验)

1、定义一个接口如下:

public interface InterfaceTest
{

/// <summary>
/// 我是接口,请务必把我全部实现
/// </summary>
void Istr();
string Igetstr();
}

此接口包含两个方法,继承者必须全部实现。

2、定义一个抽象类

public abstract class AbstractFather
{
/// <summary>
/// 我是抽象方法,请务必把我放在抽象类中。如果我的儿子乐意使用,就必须使用override重写
/// </summary>
public abstract void str();

public abstract string getstr();
}

3、定义虚方法基类

public class father
{
/// <summary>
/// 我是一个虚方法 可被我的儿子直接使用,也可被我的儿子通过override重写。
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <returns></returns>
public virtual string getstr(string A, string B)
{
return A + B;
}
public virtual string getstr(string A, string B, string C)
{
return A + B + C;
}
}

4、定义一个继承抽象类和接口的子类,如下:

/// <summary>
/// 我是子类,我继承抽象类AbstractFather和接口InterfaceTest
/// </summary>
public class AbstractChild : AbstractFather, InterfaceTest
{
/// <summary>
/// 子类必须全部实现接口
/// </summary>
public void Istr()
{
throw new NotImplementedException();
}

public string Igetstr()
{
throw new NotImplementedException();
}

/// <summary>
/// 子类必须全部实现抽象方法
/// </summary>
public override void str()
{
}
public override string getstr()
{
return "";
}

}

5、定义一个继承虚方法基类和接口的子类,如下:

/// <summary>
/// 子类必须实现接口的所有方法
/// </summary>
public void Istr()
{
throw new NotImplementedException();
}

public string Igetstr()
{
throw new NotImplementedException();
}

/// <summary>
/// 我是子类,我直接使用父类的虚方法
/// </summary>
/// <returns></returns>
public string ChildStr(string A,string B)
{
return getstr(A,B);
}
/// <summary>
/// 我是子类,我可以重写父类的虚方法
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <param name="C"></param>
/// <returns></returns>
public override string getstr(string A, string B,string C)
{
return (A + B + C).Substring(1);
}
}

至此:相信大家通过上述事例,应该明白三者之间的区别及联系了吧!

需要看的都是菜鸟,譬如博主自己!哈哈,开玩笑,~_~

浅谈C#抽象方法、虚方法、接口的更多相关文章

  1. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  2. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

  3. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  4. 浅谈 js 对象 toJSON 方法

    前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...

  5. 浅谈C#抽象类和C#接口

    原文地址:http://www.cnblogs.com/zhxhdean/archive/2011/04/21/2023353.html 一.C#抽象类: C#抽象类是特殊的类,只是不能被实例化:除此 ...

  6. 浅谈iOS开发中方法延迟执行的几种方式

    Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...

  7. 浅谈自定义UITextField的方法

    观察效果图 UITextField有以下几种特点: 1.默认占位文字是灰色的 2.当光标点上去时,占位文字变为白色 3.光标是白色的 接下来我们通过不同的方法来解决问题 一.将xib中的UITextF ...

  8. 浅谈ASP.Net ProcessPostData方法

    其实这两次方法做的都是同一件事儿,让我们来看下图片中的代码,唯一的区别就是两次传入的参数不一样,一个是postData集合和Page_Load加载前的标记,另一个是leftoverPostData集合 ...

  9. 浅谈jQuery中setInterval()方法

    定义和用法: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口 ...

随机推荐

  1. PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别

    [PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...

  2. centos时间同步方法

    centos时间同步方法 电脑软硬件应用网 45IT.COM 时间:2012-12-08 18:09 作者:李本清 新装的服务器可能设置了错误的,需要调整时区并调整时间.如下是使用NTP来从一个时间服 ...

  3. Bootstrap 下拉菜单和滚动监听插件

    一.下拉菜单 常规使用中,和组件方法一样,代码如下: //声明式用法 <div class="dropdown"> <button class="btn ...

  4. php内容

    PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 PHP中关键字通常分为四种类型: 1. 用于数据类型定义的关键字,如:int,string,bool,classic,object和a ...

  5. sphinx

    1.什么是SphinxSphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系我们(Sphinxsearch.com)以获得商业授权.一般而言,Sphi ...

  6. Redis学习笔记(7)-事务

    package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis. ...

  7. 检测电脑安装的net framework版本

    https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx To find .NET Framework versions by ...

  8. node.js使用util实现简单继承

    /** * Created by zzq on 2015/5/15. */ var util = require('util'); var Person = function(){ var myD=' ...

  9. Red and Black---hdu1312(dfs)

    2015-04-07http://acm.hdu.edu.cn/showproblem.php?pid=1312 Sample Input 6 9....#......#............... ...

  10. Dictionary、SortedDictionary、Hashtable 、SortedList

    HashTable数据结构存在问题:空间利用率偏低.受填充因子影响大.扩容时所有的数据需要重新进行散列计算.虽然Hash具有O(1)的数据 检索效率,但它空间开销却通常很大,是以空间换取时间.所以Ha ...