zoukankan      html  css  js  c++  java
  • 浅谈C#抽象方法、虚方法、接口

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

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

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

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

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

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

  • 相关阅读:
    nginx 配置 开发
    导入excel 数据到mysql出现的时间格式
    gradle 集成到myeclipse
    多线程同步和异步的方式
    谈一下spring 的理解
    java 中的反射
    Sublime Text 下配置python
    Python元组的简单介绍
    Python中strip()函数
    Python中的repr()函数
  • 原文地址:https://www.cnblogs.com/chenwolong/p/5649902.html
Copyright © 2011-2022 走看看