ASP.NET抽象类用法详细介绍总结

作者:袖梨 2022-06-25

简单的说:
1.抽象类和接口相近,区别在于,抽象类中可以部分实现其成员。
2.抽象类中至少有一个未实现的成员。
3.抽象类不能实例化,它的派生类可以被实例化。


定义方法为:

 代码如下 复制代码

以下为引用的内容:
///


/// 定义抽象类
///

abstract public class Animal
{
    //定义静态字段
    static protected int _id;
    //定义属性
    public abstract static int Id
    {
        get;
        set;
    }


    //定义方法
    public abstract void Eat();

    //定义索引器
    public string this[int i]
    {
        get;
        set;
    }
}

///


/// 实现抽象类
///

public class Dog: Animal
{
    public static override int Id
    {
        get {return _id;}
        set {_id = value;}
    }


    public override void Eat()
    {
        Console.Write("Dog Eats.")
    }
}

练习题题目:

要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能通这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前为止而以后可能会出现的存储设备进行数据交换。各个存储设备间读、写得实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个playMusic方法;

 

 代码如下 复制代码

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

namespace Practices03
{
    class Program
    {
        static void Main(string[] args)
        {
            Computer myComputer = new Computer();
            RSD myRSD = new USB();
            myRSD.ReadDate();
            myRSD.WriteDate();
            Console.ReadKey();

        }
    }
    ///


    /// RSD:移动存储设备
    ///

   abstract class RSD
    {
       public abstract void ReadDate();
       public abstract void WriteDate();
    }
   class USB:RSD
   {
       public override void ReadDate()
       {
           Console.WriteLine("ReadDate method for USB!");
       }
       public override void WriteDate()
       {
           Console.WriteLine("WtiteDate method for USB!");
       }
   }
   class MP3Player:RSD
   {
       public override void ReadDate()
       {
           Console.WriteLine("ReadDate method for MP3Player!");
       }
       public override void WriteDate()
       {
           Console.WriteLine("WtiteDate method for MP3Player!");
       }
       public virtual void PlayMusic()
       {
           Console.WriteLine("PlayMusic method for MP3Player!");
       }
   }
   class MobileHDD:RSD
   {
       public override void ReadDate()
       {
           Console.WriteLine("ReadDate method for MobileHDD!");
       }
       public override void WriteDate()
       {
           Console.WriteLine("WtiteDate method for MobileHDD!");
       }
   }
   class Computer
   {
       public RSD RSD { get; set; }
       public void ReadDate()
       {
           RSD.ReadDate();
       }
       public void WriteDate()
       {
           RSD.WriteDate();
       }
   }
}

 


何时使用抽象类
当需要一组相关组件来包含一组具有相同功能的方法,但同时要求在其他方法实现中具有灵活性时,可以使用抽象类。当预料可能出现版本问题时,抽象类也具有价值,因为基类比较灵活并易于被修改。有关详细信息,请参见抽象类与接口建议。

抽象类与接口建议请参见
抽象类   |   组件中的多态性   |   MustInherit   (Visual   Basic)   |   abstract   (C#)
选择将功能设计为接口还是抽象类(在   Visual   Basic   中为   MustInherit   类)有时是一件困难的事。“抽象类”是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能。有关详细信息,请参见抽象类。

相反,“接口”是完全抽象的成员集合,可以被看作是为操作定义合同。接口的实现完全留给开发者去做。

接口和抽象类对组件交互都很有用。如果一个方法要求一个参数形式的接口,则任何实现该接口的对象都可以用在该参数中。例如:


Visual   Basic
Public   Sub   Spin   (ByVal   widget   As   IWidget)
End   Sub

C#
public   void   Spin   (IWidget   widget)
{}
此方法可以接受任何将   IWidget   实现为小部件参数的对象,即使   IWidget   的实现可能相差很大。抽象类也允许这种多态性,但须注意以下几点:  

类可能只是从一个基类继承,所以如果要使用抽象类为一组类提供多态性,这些类必须都是从那个类继承的。  
抽象类还可能提供已实现的成员。因此,可以用抽象类确保特定数量的相同功能,但不能用接口这样做。  
这里是一些建议,帮助您决定使用接口还是抽象类为组件提供多态性。  

如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。  
如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。  
如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。  
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

相关文章

精彩推荐