您的位置:首页 > 编程语言 > C#

浅谈C#抽象方法、虚方法、接口

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

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

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

在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);
}
}

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

需要看的都是菜鸟,譬如博主自己!哈哈,开玩笑,~_~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: