SIKI学习——C#中级教程_07面向对象编程-继承

1.面向对象编程-继承

1.继承是什么?
在上一节课中学习了如何定义类,用类当做模板来声明我们的数据。
很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使用继承来让这两个类继承自同一个类。
2.继承的类型
实现继承:
表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。 在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定重写某个函数的实现代码。 在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承非常有用。
接口继承:
表示一个类型只继承了函数的签名,没有继承任何实现代码。 在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。
3.多重继承
一些语言(C++)支持所谓的 “多重继承”,即一个类派生自多个类。 使用多重继承的优点是有争议的:一方面,毫无疑问,可 以使用多重继承编写非常复杂、但很紧凑的代码,。另一方面,使用多重实现继承的代码常常很难理解和调试。 如前所述,简化健壮代码的编写工作是开发 C#的重要设计 目标。 因此,C#不支持多重实现继承。 而 C#允许类型派生自多个接 口—— 多重接口继承。 这说明,C#类可以派生自另一个类和任意多个接口。更准确地说, System.Object 是一个公共的基类,所以每个C#(除了Object类之外)都有一个基类,还可以有任意多个基接口。
4.实现继承
如果要声明派生自另一个类的一个类,就可以使用下面的语法:

class MyDerivedClass : MyBaseclass
{
 // functions and data members here
}

如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口:

public class MyDerivedClass: MyBaseClass , IInterface1 , IInterface2
{
// etc.
}

5.案例实现
基类敌人类( hp speed 方法 ai move )
派生出来两个类
boss类
type1enemy类
type2enemy类

namespace 面向对象编程_继承
{
    class Enemy
    {
        private float hp;
        private float speed;
        public float HP 
        {
            get { return hp; }
            set { hp = value; }
        }
        public float Speed
        {
            get { return speed; }
            set { speed = value; }
        }
        public void AI()
        {
            Console.WriteLine("这里是enemy1的共有Ai方法");
        }
        public void Move()
        {
            Console.WriteLine("这里是enemy1共有的move方法");
        }
    }
}
namespace 面向对象编程_继承
{
    class Boss : Enemy
    {
        public void Attack()
        {
            AI();
            Move();
            //hP = 100;//这个调用不到
            HP = 100;//父类里面共有的数据和函数成员才可以在子类里面访问
            Console.WriteLine("Boss正在进行攻击");
        }
    }
}
namespace 面向对象编程_继承
{
    class Type1Enemy:Enemy
    {
    }
}
namespace 面向对象编程_继承
{
    class Type2Enemy:Enemy
    {
    }
}
namespace 面向对象编程_继承
{
    class Program
    {
        static void Main(string[] args)
        {
            //Boss boss = new Boss();
            //boss.AI();//继承:父类里面所有的数据成员和函数成员都会继承到子类里面
            //boss.Attack();
            //Enemy enemy;
            //enemy = new Boss();//父类声明的对象,可以使用子类去构造 子类声明的对象不可以使用父类构造
            enemy虽然使用父类进行了声明,但是使用了子类构造,所以本质上是一个子类类型的,我们可以强制类型转换成子类类型
            //Boss boss = (Boss)enemy;
            //boss.Attack();            Enemy enemy = new Enemy();
            Boss boss = (Boss)enemy;//(不能进行强制转换)一个对象是什么类型的 主要看它是通过什么构造的,这里enemy是用来父类的构造函数,所以只有父类中的字段和方法,不能强制转换成子类
            Console.ReadKey();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值