Abstract、Virtual、Override关键字使用心得

1、先贴几段测试代码

代码段1:

abstract class A
    {
        public virtual string test()
        {
            return "d";
        }
    }

    class B : A
    {
        public override string test()
        {
            return "ss";
        }
    }

代码段2:

class A
    {
        public virtual string test()
        {
            return "d";
        }
    }

    class B : A
    {
        public override string test()
        {
            return "ss";
        }
    }

代码段3:

abstract class A
    {
        public abstract string test();
    }

    class B : A
    {
        public override string test()
        {
            return "ss";
        }
    }

以上三段代码的区别在哪里呢?

说明几点:

1、如果想重写父类的方法(override),即:方法名称和参数均相同,这种情况下父类的方法必须用virtual关键字限制。

2、除了abstract关键字限定的方法,都必须有方法体。就是说如果你想在一个类中只写方法的声明而不写实现,那么这个方法必须是abstract的,见代码段3

3、virtual的方法可以被调用,abstract关键字限定的类不可以被实例化(这是代码段1和2的区别)。对于代码段2来说,如果我new一个对象A obj=new B();obj.test()方法返回的是子类B中的test方法返回的值ss,因为test方法已经被B重写(override)。类A也可以被是实例化,A中的test方法也可以被调用返回d,但是代码段1中的类A则是不可被实例化的。

 

下面我们假想一个场景来看该如何使用这三个关键字,并区分abstract和 interface的实现。

假设我们有一个基础类A,需要限定一些基础行为(function),一系列子类可以重写或者实现基础类A的行为。

1、如果我们允许某些情况下可以直接调用基础类A的某些function,那么我们应该把类A声明不抽象的(不用abstract)类,然后把里面的function声明为virtual的。

2、如果我们限定基础类A中的方法必须被重写,则我们应该把A声明为abstract的,当然我们也可以用interface,但是interface不能有方法的实现(只能有方法声明),在abstract类中我们可以有方法的实现,可以在子类中调用类A中的方法,以实现一些基础行为。

见代码段:

abstract class A
    {
        public virtual string test()
        {
            return "dd";
        }
    }

    class B : A
    {
        public override string test()
        {
            return base.test();
        }
    }

 

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