zoukankan      html  css  js  c++  java
  • 总结:C#虚方法与抽象方法的区别

    虚方法与抽象方法区别

    虚方法

    抽象方法

    用virtual修饰

    用abstract修饰

    要用方法体,哪怕是一个分号

    不允许有方法体

    可以被子类override(重写)

    必须被子类override(重写)

    除了密封类都可以写

    只能在抽象类中

    代码示例

     完整代码如下

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ConsoleApplication1
     8 {
     9     public class 虚方法与抽象方法区别
    10     {
    11         /// <summary>
    12         /// 程序入口执行
    13         /// </summary>
    14         /// <param name="age"></param>
    15         public static void Main(string[] age)
    16         {
    17             StudentA stu = new StudentA();
    18             stu.People();
    19             StudentB stub = new StudentB();
    20             stub.GetPrint();
    21             Console.ReadLine();
    22         }
    23     }
    24 
    25     /// <summary>
    26     /// 定义一个抽象类
    27     /// 特点:1、抽象方法没有方法体;2、抽象方法只能在抽象类中;3、必须被子类Override重写
    28     /// </summary>
    29     public abstract class 抽象类
    30     {
    31         /// <summary>
    32         /// 使用关键字abstract定义的抽象方法
    33         /// </summary>
    34         public abstract void People();
    35     }
    36 
    37     /// <summary>
    38     /// 继承基类的方法需要override重写基类的抽象方法
    39     /// </summary>
    40     public class StudentA : 抽象类
    41     {
    42         /// <summary>
    43         /// Override重写覆盖
    44         /// </summary>
    45         public override void People()
    46         {
    47             Console.WriteLine("学生是祖国的花朵、未来的希望!");
    48         }
    49     }
    50 
    51     /// <summary>
    52     /// 普通方法
    53     /// </summary>
    54     public class PanentClass
    55     {
    56         /// <summary>
    57         /// 使用关键字virtual定义的虚方法
    58         /// 特点:1、要用方法体;2、除了密封类都可以用;3、必须被子类Override重写
    59         /// </summary>
    60         public virtual void GetPrint()
    61         {
    62             Console.WriteLine("您好,你中了100万!请领取。");
    63         }
    64     }
    65 
    66     public class StudentB : PanentClass
    67     {
    68         /// <summary>
    69         /// 实现基类的虚方法实现
    70         /// </summary>
    71         public override void GetPrint()
    72         {
    73             Console.WriteLine("您好,最终领取了80万了。");
    74         }
    75     }
    76 }
    View Code

    错误一、子类必须实现基类的抽象方法

     错误二、虚方法没有方法体

     如何选择使用虚方法还是抽象方法呢?

    虚法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。

    选择考虑方式:

    • 1、虚方法有方法体了,有实例了。如果子类有存在一样的实例可以共用时,其实子类不用重写方法体实现了。这是可以考虑用虚方法。
    • 2、抽象方法只定义一个无方法体的方法,子类必须重写抽象方法才能实例。

    例子:学生们的爱好

    抽象方法:如果要求实现输出各位同学爱好不同,则定义一个基类“学生们的爱好”抽象类,子类就是“各位同学调用抽象方法实现,某某同学喜欢打蓝球,某某同学喜欢打兵乓球。”

    虚方法:如果3个同学中,得知A同学喜欢打篮球、B同学也喜欢打篮球、C同学喜欢打兵乓球。则定义一个虚方法“A同学喜欢打篮球”,子类B可以直接调用基类的虚方法不用覆盖虚方实例。

    这是我个人理解的,不知道是否正确。

  • 相关阅读:
    信息收集之Nmap
    namp ssl秘钥安全性检测
    msf测试tomcat
    MobaXterm root用户连接虚拟机时出现Access denied
    最长公共子序列C
    web 入门58-70
    oninput,onpropertychange,onchange的用法和区别
    JavaScript判断图片是否加载完成的三种方式---转
    node.js
    SPP-Net
  • 原文地址:https://www.cnblogs.com/liuzz/p/14530477.html
Copyright © 2011-2022 走看看