c# 多态 虚方法

多态:

  为了解决同一种指令,可以有不同行为和结果

  在运行时,可以通过调用同一个方法,来实现派生类中不同表现。

   虚方法——抽象类——抽象函数——接口

虚方法:

  被virtual 关键字修饰的方法  叫做 虚方法

  虚方法通常写在你要继承的父类中, 用virtual 关键字去修饰子类要重写的方法

  让我不同的子类对象,对统一指令有不同的行为

  1.虚方法在调用,会攻击你运行时,实际的对象和最后重写的方法,去决定运行哪一个

  2.如果你是非虚方法,是需要转成对应的对象,才能执行对应的方法

  3.子类只能重写同参数列表同返回类型同名的虚方法

  4.不要在子类中去声明一个和虚方法同名的新方法,虚方法会被new给隐藏掉

    sealed:

      1.可以密封一个虚方法的重写,导致新的派生类无法重写

      2.密封一个类 ,使这个类无法被派生

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 飞行棋
{
     public class A
     {
         public virtual void Fun1(int i)
         {
             Console.WriteLine(i);
         }
         public void Fun2(A a)
         {
             a.Fun1(1);
             Fun1(5);
         }
     }
     class Program:A
     {
         public override void Fun1(int i)
         {
             base.Fun1(i+1);
         }
         static void Main(string[] args)
         {
             Program b = new Program();
             A a = new A();
             a.Fun2(b);          //2   5
             b.Fun2(a);          //1   6
             Console.ReadLine();
         }
     }
      
    
      public abstract class A
     {
         public A()
         {
             Console.WriteLine('A');
         }
         public virtual void Fun()
         {
             Console.WriteLine("A.Fun()");
         }
     }
 
     class Program :A
     {
         public Program()
         {
             Console.WriteLine('B');
         }
         public new void Fun()
         {
             Console.WriteLine("B.Fun()");
         }
         static void Main(string[] args)
         {
             A a = new Program();
             a.Fun();        // A  B  A.Fun()
             Console.ReadLine();
         }
     }
  
 
     class BaseClass
     {
         public virtual int Add(int x,int y)
         {
             return x+y;
         }
     }
     class Program:BaseClass
     {
         static int z = 100;
         public override int Add(int x, int y)
         {
             return base.Add(x,y)+z; //300
             // return x * y; 50
         }
          static void Main(string[] args)
         {
             BaseClass baseclass = new Program();
             Console.WriteLine(baseclass.Add(10,5));
             Console.ReadLine();
         }      
     }
}

 

 

posted @ 2019-01-16 15:41  D个人笔记  阅读(278)  评论(0编辑  收藏  举报