C#抽象成员、抽象类和抽象方法详解

抽象成员、抽象类和抽象方法详解

  • 抽象成员
  • 抽象类
    • 抽象类和抽象方法的示例
    • 抽象类的另一个例子

抽象成员

抽象成员是指设计为被覆写的函数成员。抽象成员有一下特征:

  1. 必须是一个函数成员。也就是说,字段和常量不能为抽象成员。
  2. 必须用abstract修饰符标记。
  3. 不能有实现代码块。抽象成员的代码用分号表示。
    例如,下面取自一个类定义的代码声明了两个抽象成员:一个名称为PrintStuff的抽象方法和一个名称为MyProperty的抽象属性。
abstract public void PrintStuff(string s);
abstract public int MyProperty
{
get;
set;
}

抽象成员只可以在抽象类中声明,一共有4个类型的成员可以声明为抽象的:

  1. 方法;
  2. 属性;
  3. 事件;
  4. 索引。
    关于抽象成员的其他重要事项如下:

尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符附加到abstract修饰符。
类似虚成员,派生类中抽象成员的实现必须指定override修饰符。

抽象类

抽象类就是指设计为被继承的类。抽象类只能被用作其他类的基类。

  1. 不能创建抽象类的实例。
  2. 抽象类使用abstract修饰符声明。
  3. 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带实现的成员的任意组合。
  4. 抽象类自己可以派生自另一个抽象类。例如,下面的代码展示了一个抽象类,它派生自另一个抽象类。
abstract class AbClass
{
*********
}
abstract class MyAbClass:AbClass
{
******
}

任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。

抽象类和抽象方法的示例

下面的代码展示了一个名为AbClass的抽象类,它有两个方法。
第一个方法是一个带有实现的普通方法,它打印出类型的名称。第二个方法是一个必须在派生类中实现的抽象方法。类DerivedClass继承AbClass,实现并覆写了抽象方法。Main创建DerivedClass的对象并调用它的两个方法。

abstract class AbClass  //抽象类
{
public void IdentifyBase()  //普通方法
{Console.WriteLine("I am AbClass");}
abstract public void IdentifyDerived();  //抽象方法
}
class DerivedClass:AbClass  //派生类
{
override public void IdentifyDerived()  //抽象方法的实现
{Console.WriteLine("I am DerivedClass");}
}
class Program
{
static void Main()
{
//AbClass a=new AbClass(); //错误,抽象类不能实例化
//a.IdentifyDerved();
DerivedClass b=new DerivedClass();  //实例化派生类
b.IdentifyBase();  //调用继承的方法
b.IdentifyDerived();  //调用“抽象”方法

这段代码产生以下输出:

I am AbClass
I am DerivedClass

抽象类的另一个例子

如下代码演示了包含数据成员和函数成员的抽象类的声明。记住,数据成员(字段和常量)不可以声明为abstract。

 abstract class MyBase  //抽象和非抽象成员的组合
    {
        public int SideLength = 10;  //数据成员
        const int TriangleSideCount = 3;  //数据成员
        abstract public void PrintStuff(string s);  //抽象方法
        abstract public int MyInt { get; set; }  //抽象属性

        public int PerimeterLength()  //普通的非抽象方法
        {
            return TriangleSideCount * SideLength; 
        }
         
    }
    class MyClass : MyBase
    {
        public override void PrintStuff(string s)  //覆盖抽象方法
        {
            Console.WriteLine(s);
        }
        private int _myInt;
        public override int MyInt   //覆盖抽象属性
        {
            get { return _myInt; }
            set { _myInt = value; } 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.PrintStuff("This is a string");
            mc.MyInt = 28;
            Console.WriteLine(mc.MyInt);
            Console.WriteLine("Perimeter Length:{0}",mc.PerimeterLength(  ));
        }

       
    }

这段代码产生如下输出:

This is a string
28
Perimeter Length:30

你可能感兴趣的:(C#抽象成员、抽象类和抽象方法详解)