zoukankan      html  css  js  c++  java
  • 关于C#中一些关于Inheritance和Polymorphism的事情……

      在面向对象的语言中,继承和多态是十分重要的两个特征。目前,C#和Java均为单继承多接口语言,能够有效利用面向对象的特征进行编程。其中继承是一个将类具体化的过程,继承深度越高,类就越具体。多态则是用不同的具体化方法实现同一种功能的接口,让父类具有子类的特征。同时多态可以实现代码的复用。

      1. virtual方法

        virtual方法定义基类中的虚函数,这种函数可以被子类继承,并在子类中被override成具有子类特性的新函数。比如:

            public virtual int sum(){}   //……在基类中

                           public override int sum(){}    //……在子类中

              注意,C#中的override关键字,在子类中覆盖函数,此时基类改变此函数,子类并不会发生变化,起到了保护的作用。

        2. new修饰符

            和override比较,new可以显示地隐藏从基类继承的成员函数。虽然都是使用子类自己的函数,但是new会隐藏掉、截断掉基类的函数,而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     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             A objA = new D();
    14             A objB = new B();
    15             C objC = new D();
    16             A objD = new A();
    17             objA.Movie();
    18             objB.Movie();
    19             objC.Movie();
    20             objD.Movie();
    21 
    22         }
    23             class A {  
    24                 public virtual void Movie() {
    25                 Console.WriteLine("MikiMouse");
    26                           }
    27                      }
    28             class B : A {
    29                 public override void Movie () {
    30                 Console.WriteLine("DisneyMovie");
    31                          }
    32                      }
    33 
    34         class C : B {
    35                 public new virtual void Movie () {
    36                 Console.WriteLine("Snow White");
    37                         }
    38                      }
    39        class D : C {
    40                 public override void Movie () {
    41                 Console.WriteLine("Seven Dwarfs ");
    42                         }
    43                      }
    44         
    45     }
    46 }

            其输出结果是:

     

            简而言之,new virtual相当于一个断点,截断了继承流。

  • 相关阅读:
    Android自己主动升级框架
    一句话说清楚啥是delegate
    C#
    MySQL Community Server 5.6和MySQL Installer 5.6
    仿htc sense的弹性listView!
    双向队列(STL做法)
    余承东:未来5年中国大部分智能手机厂商消失
    P3808 【模版】AC自动机(简单版)
    P1103 书本整理
    P2580 于是他错误的点名开始了
  • 原文地址:https://www.cnblogs.com/Dukechris/p/4380085.html
Copyright © 2011-2022 走看看