c#中虚方法和抽象方法的应用

一、抽象类

        它的作用就是产生子类的同时给于子类一些特定的属性和方法。abstract修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其他类的父类。标记为抽象或包含在抽象类中的成员必须通过从抽象类的子类来实现。特点:抽象类不能实例化,抽象函数不能实现,必须在非抽象函数中重写。如果类包含抽象函数,那么类也是抽象的,必须声明为抽象的。

using System;
public abstract class Animal
{
    public abstract void Bark();
}

public class Dog:Animal
{
    public override void F()
    {
        console.WriteLine("狗狗旺旺")
    }
}

public class Cat:Animal
{
    public override void F()
    {
        console.WriteLine("猫猫咪咪")
    }
}

class Test
{
    static void Main()
    {
       Animal a=new Dog();//创建一个子类对象赋值给父类
       a.Bark();//输出狗狗旺旺
       console.ReadKey();
       Animal a=new Cat();//创建一个子类对象赋值给父类
       a.Bark();//输出猫猫咪咪
       console.ReadKey();
    }
}

二、虚方法

        虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑;virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。最重要的就是抽象方法不能实例化,要子类必须强制性的覆盖它的方法 。而虚方法则是提供了选择,可以覆盖可以不覆盖,继承基类中的虚方法。

Using System;  
   
class   A  
 {  
  Public void F ()  
  {   
      Console.WriteLine("A的F方法");  
  }
   
  public virtual void G()  
  {  
      Console.WriteLine("A的G方法");   
  }
 }  
   
  Class B: A  
   
  {  
   
  New public void F ()  
  {   
      Console.WriteLine("B的F方法");  
  }
   
  public override void G()  
  {   
      Console.WriteLine("B的G方法"); 
  }
   
  }  
   
Class Test  
  {   
      static void Main(){  
      B b = new B();  
      A a = b;  
      a.F();   
      b.F();  
      a.G();  
      b.G();  
  }  
}   
输出是:A的F方法  B的F方法  B的G方法  B的G方法

三、虚方法和抽象方法的应用

相比而言,虚方法倾向于代码复用,抽象方法更类似一种规约来约束子类必须实现某方法。

1、虚方法必须有实现部分,抽象方法不可以有实现部分;
2、虚方法可以在派生类中重写也可以不重写,抽象方法必须在派生类中重写
3、虚方法可以在任何非密封类中声明,抽象方法只能在抽象类中声明。
4、如果类包含抽象方法,那么该类也必须为抽象的,不能实例化。

这里引用一个例子:
比如有个基类“动物”;两个子类“狮子”、“青蛙”。
狮子捕猎:锁定目标、用牙齿和利爪抓获;
狮子说话:噢呜;
青蛙捕猎:锁定目标、用舌头抓获;
青蛙说话:呱呱;

对于捕猎,他们有共性也有区别:
所以就可以把捕猎声明为虚方法,基类里实现共性部分、各子类实现个性部分;
对于说话,完全不同,但是又必须让他们说话
所以就可以把说话声明为抽象方法,基类只声明此方法来作为约束,强制子类实现。

你可能感兴趣的:(随笔,c#,开发语言,asp.net)