抽象方法与虚方法的理解(abstract & virtual)

#引言
 最近看大话设计模式的时候注意到了C#的两个关键字,virtual & abstract,抽象方法和虚方法,感觉自己有点小纠结,来个小结吧。
##共同点:
1.virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
2.如果用来修饰方法,前面修饰符都是public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。
当然上那两个其实说的是一回事。
##区别:
区别还是蛮大的。

a) virtual修饰的方法必须有方法实现,就是必须有方法体(哪怕只有一对空的大括号),abstract修饰的方法不能有实现。
demo展示:

        public class Test1
        {
            public virtual void fun1()        //虚方法
             {
             }
        }
        public abstract class Test2
        {
            public abstract void fun2()   //抽象方法
        }

b) virtual可以被子类重写,abstract必须被子类重写

虚方法:

   class BaseTest1
    {
       public virtual void fun()
       { }                               //父类必须要实现fun()
    }

    class DeriveTest1:BaseTest1
    {
        //public override void fun() { }     //子类可以不重写父类方法(这行代码可省略),编译无错误
    }

抽象方法:

abstract class BaseTest2
    {
        public abstract void fun();
    }
    class DeriveTest2 : BaseTest2
    {
        //public override void fun();  错误1:没有实现
        //public  void fun() { }          错误2:重写时没有添加override
        //override void fun() { }     错误3:虚拟成员或者抽象成员不能是私有的(只要在父类中声明了虚拟成员或抽象成员,即便是继承的也要加上这个限制)
       //public override void fun() { } //错误4:子类必须要重写父类的抽象方法,BaseTest2.fun()方法必须被实现。   
        public override void fun()   //这才是正确的实现方式
            { 
              Console.writeline("玩游戏")
            }
    }
(c) 无法创建abstract类的实例,因为抽象类只能被继承而无法实例化,比如: BaseTest2 base2 = new BaseTest2(); 将出现编译错误:抽象类或接口不能创建实例。 (d) C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。 (e) 抽象方法只能在抽象类中声明,但虚方法不是,虚方法可以在抽象类中也可以在普通类中声明。 #总结: 1.abstract方法必须被重写,因为抽象方法是一种强制子类覆盖的方法。 2.virtual方法必须有实现,父类里面必须已经有可实现的方法体,这样子类不重写父类方法也可以直接继承复用。
抽象方法虚方法都是面向对象编程的重要概念,用于实现多态性和继承。 抽象方法Abstract Method)是在抽象类或接口声明的方法,它没有具体的实现代码。抽象方法只有方法的声明,而没有方法体。抽象方法必须在非抽象子类被实现,否则该子类也必须声明为抽象类。使用抽象方法可以强制子类实现特定的方法,以满足特定的需求。在C#,使用`abstract`关键字来声明抽象方法。 示例代码: ```csharp public abstract class Animal { public abstract void MakeSound(); } public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof!"); } } public class Cat : Animal { public override void MakeSound() { Console.WriteLine("Meow!"); } } Animal dog = new Dog(); dog.MakeSound(); // 输出: Woof! Animal cat = new Cat(); cat.MakeSound(); // 输出: Meow! ``` 虚方法Virtual Method)是在基类声明的可以被子类重写的方法虚方法提供了一种方式,让子类可以根据自己的需求来重新定义基类的行为。在C#,使用`virtual`关键字来声明虚方法。 示例代码: ```csharp public class Shape { public virtual void Draw() { Console.WriteLine("Drawing a shape."); } } public class Circle : Shape { public override void Draw() { Console.WriteLine("Drawing a circle."); } } public class Square : Shape { public override void Draw() { Console.WriteLine("Drawing a square."); } } Shape shape = new Circle(); shape.Draw(); // 输出: Drawing a circle. shape = new Square(); shape.Draw(); // 输出: Drawing a square. ``` 在上述示例,基类`Shape`的`Draw`方法被声明为虚方法,子类`Circle`和`Square`可以根据自己的需求来重写`Draw`方法,实现不同的绘制行为。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值