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

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

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

在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 递归创建目录、递归删除非空目录、迭代创建目录

    递归创建目录 方法一 function mk_dir($path){ if(is_dir($path)){ //参数本身是一个目录 return true; } if(is_dir(dirname($ ...

  2. Oracle 语句常见错误

    Merge into的注意点之ORA-30926:无法在源表中获得一组稳定的行? merge into 的内部处理是将table_source 的每一条记录和table_target的每一条记录对比匹 ...

  3. Flink - FlinkKafkaConsumer08

      先看 AbstractFetcher 这个可以理解就是,consumer中具体去kafka读数据的线程,一个fetcher可以同时读多个partitions的数据来看看 /** * Base cl ...

  4. The Dataflow Model 论文

    A Practical Approach to Balancing Correctness, Latency, and Cost in MassiveScale, Unbounded, OutofOr ...

  5. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  6. Delphi 缩放图像代码 - 支持PNG透明通道

    要求Delphi2007或者更高版本, 系统要求至少XP-SP2以上 实际上是利用了Windows的windowscodecs.dll这个文件的功能 在VCL里已经封装为TWICImage类 proc ...

  7. JDK核心包学习

    StringBuffer   线程安全.可变字符序列 StringBuilder   非线程安全.可变字符序列,比StringBuffer更快 Boolean 使用valueOf产生Boolean实例 ...

  8. How to disable and clear query ranges in sysquery form

    query = new query('Query name'); queryBuildDataSource = query.dataSourceTable(tableNum('table name') ...

  9. 长宽广州地区DNS

    网络又抽风了,发现时DNS的问题. 打客服电话问到了长宽广州的DNS: 首选:211.162.62.1备用:211.162.62.61

  10. qq临时会话代码修改

    使用:http://wpa.qq.com/msgrd?V=1&Uin=965745468&Site=www.***.com&Menu=yes提示 抱歉,无法发起临时会话,您可以 ...