C# 关于抽象

抽象分为抽象类,抽象方法
(1)抽象类
类声明前加一个abstract关键字,表示此类是抽象类,抽象类不能被实例化。示例:public abstract class A{};
(2) 抽象方法
仅仅只有abstract class才能够abstract method。
抽象方法没有函数体,以“;”结束。派生类若想能够实例化,必须实现抽象方法,示例:
public abstract class A
{
    public abstract void DoWork(int i);
}

(3)抽象方法的传递性
要在派生类中实现抽象方法,必须用到关键词override,所以抽象方法具有传递性,示例如下:
namespace ConsoleApplication7Abstract
{
    abstract class Class1
    {
        public void func1(int x)
        {
            Console.WriteLine("this is method in abstract class");
        }
        public abstract void func2(string str);
    }


    class Class2:Class1
    {
        public override void func2(string str) //must add override for this method
        {
            Console.WriteLine("this is method in derived class");
        }
    }


    class Class3 : Class2
    {
        public override void func2(string str)
        {
            base.func2(str);
        }
    }
}

(4)抽象,多态,接口的比较
就像private,protected,public中的protected介于private和protected之间,abstract的作用同样介于virtual,interface之间。
virtual是基类定义了virtual属性,方法,但是派生类完全可以不去override他们。
interface是定义了属性,方法的接口,派生类必须去完全实现他们。
abstract则是在基类中定义了部分接口,这部分接口派生类必须去实现它。然而abstract class中也可以定义virtual method,一般的非 virtualmethod。所以abstract的作用能力在virtual 和interface之间,基类有必须要实现的也有可以去选择实现的。

(5)抽象类可以用abstract 重写 virtual方法
   
 class Class2
    {
        public override void func2(string str)
        {
            Console.WriteLine("this is method in derived class");
        }


        public virtual void funv()
        { 


        }


        public virtual void funva()
        {
            Console.WriteLine("this is virtual method in abstract class");
        }
    }


    abstract class Class3 : Class2
    {
        public override void func2(string str)
        {
            base.func2(str);
        }


        public  abstract override void funva();	//use abstract to override virtual method
    }



上面将virtual声明为abstract,则对于从抽象类来说继承的方法依然是virtual method

你可能感兴趣的:(C#,abstract)