c#继承用法

一,继承:

一个类具有另一个类的属性和方法,这个类叫子类(派生类),另一个类叫父类(基类、超类)

继承的关键符号   :(冒号)

public abstract class Shape

    {

        public abstract double length();

        public abstract double Area();      

    }

    public class Circle : Shape

    {

        private double r;

        private double PI = Math.PI;

        public Circle(double r)

        {

            this.r = r;

        }

        public override double length()

        {

            return 2 * PI * r;

        }

        public override double Area()

        {

            return PI * r * r;

        }     

    }

1,特性

     1、子类继承了父类的属性和方法(public、protected),但是构造方法不能被继承

     2、子类使用构造方法调用父类构造方法用 base()

     3、创建子类对象时,系统默认先调用父类构造方法,然后再调用子类构造方法

     4、子类使用父类的属性和方法用  base 关键字(public、protected)

2,注意

当父类有有参构造方法时,如果子类有构造方法(无参或有参),要求父类必须有一个无参构造方法。

如果子类没有构造方法,父类也需要提供一个无参构造方法。

如果不提供,子类构造方法会报错!

二,重写     

重写:在子类和父类中,子类中的方法名称和父类方法名称相同,参数相同

重载(overload):在同一个类中,方法名称相同,参数不同(个数、类型),与返回值无关

public virtual void Eat()//虚方法

        {

            Console.WriteLine("吃白萝卜");

        }

public override void Eat()//重写方法

        {

            Console.WriteLine("吃肉");

        }

三,虚方法

在某基类中声明 virtual 并在一个或多个派生类中被重新定义的成员方法称为虚方法。

虚方法的作用就是实现多态性(Polymorphism),多态性是将接口与实现进行分离。

在基类的函数中声明关键字virtual,就可以在其派生类中通过关键字override重写该方法。重写后的virtual方法依旧是virtual方法。

当有一个定义在类中的方法需要在继承类中实现时,可以使用虚方法。

四,虚方法与一般方法的区别

1、写法不同

2一般方法在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死的!而虚方法在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的方法。

class Enemy
    {
        public virtual void Move()
        {
            Console.WriteLine("这是调用的Enemy.Move()");
        }
        public void AI()
        {
            Move();
            Console.WriteLine("这是调用的Enemy.AI()");
        }
    }
    class Boss:Enemy
    {
        public override void Move()
        {
            Console.WriteLine("这是调用的Boss.Move()");
        }
        public void A()
        {
            Move();
            Console.WriteLine("这是调用的Boss.A()");
        }
    }
    class Program
    {
 
        static void Main(string[] args)
        {
 
            Boss boss1 = new Boss();
            boss1.AI();//这是调用的Boss.Move();这是调用的Enemy.AI()
            boss1.Move();//这是调用的Boss.Move()
            boss1.A();//这是调用的Boss.Move();这是调用的Boss.A()
 
            Console.WriteLine("----------------");
 
            Enemy enemy = new Enemy();
            enemy.AI();//这是调用的Enemy.Move();这是调用的Enemy.AI()
            enemy.Move();//这是调用的Enemy.Move()
 
            Console.WriteLine("----------------");
 
            Enemy boss2 = new Boss();
            boss2.Move();//这是调用的Boss.Move()。如果没有Override(即隐藏函数),则会调用Enemy.Move()
 
            Console.ReadKey();
        }
    }

五,sealed关键字

C#提供了一个sealed 修饰符,此修饰符会阻止其他类从该类继承。

六,使用继承的好处

(1)继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。(拓展新功能

(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系

(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性

(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值