zoukankan      html  css  js  c++  java
  • 【转】Virtual 与 abstract 区别之我见

    Virtual 与 abstract 区别之我见

    原文:http://www.cnblogs.com/wyjgreat/archive/2011/06/07/2074182.html 
     
    1.abstract方法只能在抽象类中声明,虚方法则不是。
       abstract方法必须在派生类中重写,而virtual则不必

    2.abstract方法不能声明方法实体,
          abstract public void SD();
       虚方法则可以
          public virtual void sdf()
            {
                Console.WriteLine("A");
            }
    3.虚方法可以实现多态,而抽象方法不可以。。。

    ================================================================
    c#中的interface abstract 与 virtual

    interface用来声明接口
    1.只提供一些方法规约,不提供方法主体
    . 如:
    public interface IPerson
    {
        void getName();//不包含方法主体
    }
    2.方法不能用public abstract等修饰,无字段变量,无构造函数。
    3.方法可包含参数
    。 如
    public interface IPerson
    {
        void getAge(string s);
    }

    一个例子(例1):
    public interface IPerson
    {
       IPerson();              //错误
       string name;            //错误
       public void getIDcard();//错误

       void getName();         //right
       void getAge(string s); //right
    }

    实现interface的类
    1.与继承类的格式一致,如 public class Chinese:IPerson{}
    2.必须实现 interface 中的各个方法

       例2,继承例1
    public class Chinese:IPerson
    {
       public Chinese(){}                  //添加构造
       public void getName(){}          //实现getName()
       public void getAge(string s){} //实现getAge()
    }

    abstract声明抽象类、抽象方法
    1.抽象方法所在类必须为抽象类
    2.抽象类不能直接实例化,必须由其派生类实现。
    3.抽象方法不包含方法主体,必须由派生类以override方式实现此方法,这点跟interface中的方法类似


    public abstract class Book
    {
    public Book()
    {  
    }

    public abstract void getPrice();      //抽象方法,不含主体
    public virtual void getName()   //虚方法,可覆盖
    {
          Console.WriteLine("this is a test:virtual getName()");
    }
    public virtual void getContent()   //虚方法,可覆盖
    {
          Console.WriteLine("this is a test:virtual getContent()");
    }
    public void getDate()                           //一般方法,若在派生类中重写,须使用new关键字
    {
          Console.WriteLine("this is a test: void getDate()");
       }
    }

    public class JavaBook:Book
    {
          public override void getPrice()   //实现抽象方法,必须实现
          {
               Console.WriteLine("this is a test:JavaBook override abstract getPrice()");
          }
          public override void getName()   //覆盖原方法,不是必须的
          {
               Console.WriteLine("this is a test:JavaBook override virtual getName()");
          }
    }

    测试如下:
    public class test
    {
       public test()
       {
        JavaBook jbook=new JavaBook();
             jbook.getPrice();      //将调用JavaBook中getPrice()
             jbook.getName();       //将调用JavaBook中getName()
             jbook.getContent();    //将调用Book中getContent()
             jbook.getDate();       //将调用Book中getDate()

        }
       public static void Main()
       {

           test t=new test();
       }
    }

    virtual标记方法为虚方法
    1.可在派生类中以override覆盖此方法
    2.不覆盖也可由对象调用
    3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法

    abstract 与virtual : 方法重写时都使用 override 关键字

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/SummerRain/p/2635638.html
Copyright © 2011-2022 走看看