zoukankan      html  css  js  c++  java
  • abstract和virtual

    1、abstract

          ·抽象方法就是没有实现的,必须是形如:
                 public abstract void Init();


       ·拥有抽象方法的类必须修饰一个abstract关键字从而变成一个抽象类;但是反过来,抽象类里面不一定要有抽象方法,比如我写了一个非抽象类,但是这个类我不想让人直接实例            化,而只让人继承,我就可以把他变成一个抽象类,虽然他里面并没有抽象方法。形如:
         abstract class TestAbstractSuper


       ·抽象类不能被实例化,只能被继承。

       ·抽象类的子类必须实现每个抽象方法。

       ·抽象类里面除了可以有抽象方法以外,也可以有普通的方法。

       ·抽象类的构造函数可以省略,编译器会自动加上,但是不能是一个抽象方法,而只能是一个普通的构造函数。

          抽象类是不能被实例化的,但抽象类可以有构造函数。抽象类的构造函数用来初始化抽象类的一些字段,而这一切都在抽象类的派生类实例化之前发生。不仅如此,抽线类的构造函数还有一种巧妙应用:就是在其内部实现子类必须执行的代码。以下就是在抽象类的构造函数中来初始化字段。

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Employee employee = new Employee();
     6             Console.WriteLine(employee.ID);
     7             Console.ReadKey();
     8         }
     9     }
    10 
    11     public abstract class Base
    12     {
    13         private Guid _id;
    14 
    15         public Base()
    16         {
    17             this._id = Guid.NewGuid();
    18         }
    19 
    20         public Guid ID
    21         {
    22             get { return this._id; }
    23         }
    24     }
    25 
    26     public class Employee : Base
    27     {
    28         
    29     }

    小结:简单概括一下,抽象类不可以直接实例化,他可以有n个(n>=0)抽象方法,这些抽象方法子类必须实现。

    virtual:

    1、声明了virtual的方法无需去改动类的声明,他只在此方法上起到影响。
    2、只有virtual的方法可以被子类override。
    3、子类可以不ouverride父类的virtual方法,这种情况下他就像普通的父类方法一样。
    小结:简单概括一下,virtual关键字就是告诉子类,此方法可以被override,但非强制。

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
     
    
    using System.Diagnostics;
    
     
    
    namespace TestAppAllHere
    
    {
    
        abstract class TestAbstractSuper
    
        {
    
            public TestAbstractSuper() 
    
            {
    
                Debug.WriteLine("这是父类的构造方法");
    
            }
    
     
    
            public abstract void Init();
    
     
    
            public void Hello() 
    
            {
    
                Debug.WriteLine("这是父类的非抽象方法");
    
            }
    
        }
    
    }
    

      

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
     
    
    using System.Diagnostics;
    
     
    
    namespace TestAppAllHere
    
    {
    
        class TestAbstractSub:TestAbstractSuper
    
        {
    
            public TestAbstractSub() 
    
            {
    
                Debug.WriteLine("这是子类的构造方法");
    
            }
    
     //___________________没有重写这个虚拟方法也是可以照常运行的,会调用父类的虚拟方法_________________________        
    //___________________重写了之后父类的虚拟方法不会运行,而是重写,当然可以用base.来调用父类的方法__________ public override void Init() { Debug.WriteLine("这是子类重写的方法"); } } }

     调用

    <span style="white-space:pre">	</span>    TestAbstractSub sub = new TestAbstractSub();
    
                sub.Init();
    
                sub.Hello();
    

     输出:

    这是父类的构造方法
    
    这是子类的构造方法
    
    这是子类重写的方法
    
    这是父类的非抽象方法
    

      

           

  • 相关阅读:
    IntelliJ IDEA设置代码括号对齐方式
    cygwin完全安装步骤方法(过程图解)
    IntelliJ IDEA(2017)安装和破解
    ANDROID学习之路
    最新Android系统版本与API等级对应关系表
    Matlab 2016b 正式版下载
    山东省高等学校教师资格考试题库(附答案)
    Java中List集合去除重复数据的方法
    jquery判断选择元素是否存在
    人民币金额转化汉字的java写法
  • 原文地址:https://www.cnblogs.com/WebApp-DotNet/p/11186891.html
Copyright © 2011-2022 走看看