C#基础知识练习2

继承

当多个类有很多相似的数据,比如在一个在游戏中,Boss类和小怪Enemy类,他们都有存在hp这个属性,但是也存在不同的地方,这个时候可以使用继承来维护的=这两个类。

继承的类型:

  • 实现继承
  • 接口继承

怪物基类BaseEnemy

    class BaseEnemy
    {
        private float hp;
        private float spped;

        public float HP
        {
            set { hp = value; }
            get { return hp; }
        }

        public float Speed
        {
            set { hp = value; }
            get { return spped; }
        }

        public void AI()
        {
            Console.WriteLine("这是基类的AI方法");
        }

        public void Move()
        {
            Console.WriteLine("这是基类的移动方法");
        }
    }

子类Boss

    class Boss:BaseEnemy  //继承有怪物基类
    {
        public void Attack()
        {
            AI();
            Move();
            //hp = 100;
            HP = 100;
            //父类里面只有公有变量(public)和函数成员可以直接在子类访问
            Console.WriteLine("这是Boss特有的攻击方法");
        }
    }

主函数:

    class Program
    {
        static void Main(string[] args)
        {
            Boss boss = new Boss();
            boss.Attack();
            //父类里面所有的数据的数据成员和函数成员都会继承到子类里面
            Console.ReadKey();
        }
    }

运行结果:

这是基类的AI方法
这是基类的移动方法
这是Boss特有的攻击方法

父类声明的对象可以用子类去构造,但是子类声明的对象不能用父类去构造
例子:

            BaseEnemy baseEnemy = new Boss();
            Boss boss = (Boss)baseEnemy;
            boss.Attack();

虚方法 Virtual

虚函数不一定要重写

当多个怪物类拥有不同的动画系统时,基类就可以使用虚方法的形式供子类调用,子类负责重写虚方法,然后完善各自的细节

父类BaseEnemy:

        public virtual void Animataion()  //提供子类重写的虚方法
        {
            Console.WriteLine("这是基类的动画方法");
        }

子类Boss:

        public override void Animataion()
        {
            Console.WriteLine("这是Boss特有的动画");
        }

调用结果:

            Boss boss = new Boss();
            boss.Animataion();

            //调用结果:
            //这是Boss特有的动画

抽象方法(abstract)

抽象方法必须要重写

抽象类不能实例化,抽象类可以包含一个普通函数和抽象函数,抽象函数只有函数定义没有函数体。

this 和 base 关键字

  • this 可以访问当前类只能滚定义的字段,属性和方法,用this可以给出提示,不用this也是可以访问的
  • base调用父类的方法

密封类和密封方法 sealed

对于类,这表示不能继承该类。对于方法,表示该方法不能重写

特点:
可以防止重写某些类导致代码混乱

派生类的构造函数

  • 在子类中,会的先调用父类的构造函数,然后在条用子类的构造函数。

    例:

Public class Boss{
    public Boss():base(){
    //Do something
    }
}

修饰符

这里写图片描述
这里写图片描述

protect受保护的方法,只有派生类才可以调用
static 静态方法,只能通过类名访问

定义和实现的接口

每个类可以实现多个的接口,但是只能继承一个类
接口类:

interface Ifly()
{
    void Fly();
}

实现类:

class Brid : IFly
{
    public void Fly()
    {
        //TODO
    }
}

泛型

定义一个泛型就是指,定义一个类,这个类中的某些字段的类型是不确定的,这些类型可以在构造函数的时候确定下来

定义一个带有构造函数的泛型类:

    class Generic<T>  //定义一个泛型T的数据类型,在构造函数的时候确定T的类型
    class Generic<T>  //定义一个泛型T的数据类型,在构造函数的时候确定T的类型
    {
        private T a;
        private T b;
        public Generic(T a,T b)
        {
            this.a = a;
            this.b = b;
        }

        public void GetSum() //参数的相连
        {
            Console.WriteLine( a + "" + b);
        }
    }

主程序:

    class Program
    {
        static void Main(string[] args)
        {
            var v= new Generic<string>("www.","baidu.com");
            v.GetSum();
            Console.ReadKey();
        }
    }

运行结果:

www.baidu.com

泛型方法

        public static string GetSum<T1,T2>(T1 a,T2 b)  //带有两个形参的泛型方法
        {
            return a + " " + b;
        }

主程序:

        static void Main(string[] args)
        {
            string s = GetSum<int, double>(1, 3.14159);
            Console.WriteLine(s);
            Console.ReadKey();
        }

输出结果:

1 3.14159

猜你喜欢

转载自blog.csdn.net/gsm958708323/article/details/79210308