【Unity之c#专题篇】—核心章题单实践

这篇具有很好参考价值的文章主要介绍了【Unity之c#专题篇】—核心章题单实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Unity之c#专题篇】—核心章题单实践


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityc#专题篇习题

【Unity之c#专题篇】—核心章题单实践


⭐习题总结专题篇⭐



🎶前言

核心章知识点详解入口


🅰️ 题单来自:B站唐老狮


🎶(A) 面向对象


  • 实践经验

    1.类是对象,清楚类的本质
    2.对象和对象之间可作为参数相互联系(学生继承人,食物作为参数给学生)

【Unity之c#专题篇】—核心章题单实践

 class Person
    {
      public   int age = 18;
      public   String name = "张三";
    }
    class Student : Person
    {
        String school ="北大";
        String sClass ="英语21102班";
        public void Eat(Food nice )
        {
           
            Console.WriteLine("我叫{0},今年{1}岁,就读于{2}{3},喜欢吃{4}", name, age, school, sClass, nice.foodName);
        }
    }
    class Food
    {
        public  String foodName ="西瓜";
        int foodForce;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student A  = new Student();
             Food  nice = new Food();
            A.Eat(nice);
        }
    }

🎶(B)封装-成员变量和成员方法


  • 实践经验

    1.成员变量是对象的特征
    2.成员方法是对象的行为
    3.用面向对象的角度去看待和解决问题

【Unity之c#专题篇】—核心章题单实践

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _成员变量和访问修饰符
{
    /// <summary>
    /// 对象为人类
    /// </summary>
    class Person
    {
        public String name;
        public float heigt;
        public  Int32 age;
        public String area;
        public Person(String name,float  heigt ,Int32  age ,String area):this()
        {
            this.name = name;
            this.age = age;
            this.heigt = heigt;
            this.area = area;
            Console.WriteLine("信息构造成功,该学生的姓名为{0},身高为{1},年龄为{2},地址为{3}", this.name, this.heigt, this.age, this.area);
        }
        public Person()
        {
            Console.WriteLine("构造函数的有参构造的最大作作用开始启动——一键赋值!");
                
        }

            

        public void Speak()
        {
            Console.WriteLine("嗨你好,请叫我智能语音助手");
        }
        public void Work()
        {
            Console.WriteLine("行走方式为直立行走");
        }
        public void Eat()
        {
            Console.WriteLine("进食方式为使用餐具");
        }

    }
    /// <summary>
    /// 对象为学生
    /// </summary>
    class Student 
    {
        public String name;
        public Int32 idea;
        public Int32 age;
        public String classMate;
    
        public void S_Main()
        {
            Console.WriteLine("我的学习方式为复盘");
        }
        public void Eat()
        {
            Console.WriteLine("进食方式为使用餐具");
        }
    }
    /// <summary>
    /// 对象为班级
    /// </summary>
    class MClass
    {
        public String major;
        public String capitary;
        public Int32 studentS;
    }
    class Food
    {
        String name;
        float Hat;
    }

    /// <summary>
    /// 项目入口
    /// </summary>
    class Mian
    {
        static void Main(string[] args)
        {
            //开始创建多个人对象
            Person A = new Person("张三", 163, 23, "湖南");
        }
    }

}


🎶(C)封装-构造函数和析构函数


  • 实践经验

    1.最大作用一键赋值
    2.this对构造函数调用顺序的改变
    【Unity之c#专题篇】—核心章题单实践
class Ticket
    {
        public float distance;
        public float price;
        public float rate = 1;
        Ticket() //无参构造
        {
            Console.WriteLine("欢迎浏览车票信息!");
        }
        public Ticket(float dis):this() //调整构造函数调用的顺序
        {
            if (dis < 0)
            {
                Console.WriteLine("请传入不为负数的参数");
            }
            else
            {
                distance = dis;

            }
            ShowTicket();
        }
        public void GetPrice()
        {
            if (distance > 100 && distance <= 200) rate = 0.95f;
            else if (distance > 200 && distance <= 300) rate = 0.9f;
            else if (distance > 300) rate = 0.8f;
            price = rate * distance;
        }
        public void ShowTicket()
        {
            GetPrice();
            Console.WriteLine("本车票信息如下:\n 全程{0}公里\n 票价共{1}元", distance, price);
        }
        static void Main(string[] args)
        {
            Ticket B = new Ticket(288);
        }
    }
    #endregion


🎶(D)封装-成员属性


  • 实践经验

    1.解决了3P的局限性,提高了安全性
    2.用属性的逻辑规则进行保密处理
    3.自动属性(无逻辑规则的时候用)

【Unity之c#专题篇】—核心章题单实践

 #region 18.学生自我介绍行为实现
    class Student
    {
     
        String sex;
        Int32 age;
        float cGrade;
        float uGrade;

        /// <summary>
        /// 四个属性的定义
        /// </summary>
        /// 
        public int A { get; set; } = 666;

        public String Name{ get; set; }
        public int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                if (value >= 0 && value <= 150)
                    this.age = value;
                else Console.WriteLine("年龄超出范围!");
            }
        }
        public String Sex
        {
            get
            {
                return this.sex;
            }
            set
            {
                if (value == "男" && value == "女") this.sex = value;

                else Console.WriteLine("请传入男或者女");
            }
        }
        public float CGrade
        {
            get
            {
                return this.cGrade;
            }
            set
            {
                if (value >= 0 && value <= 100)
                    this.cGrade = value;
                else Console.WriteLine("成绩超出范围!");
            }
        }
        public float UGrade
        {
            get
            {
                return this.uGrade;
            }
            set
            {
                if (value >= 0 && value <= 100)
                    this.uGrade = value;
                else Console.WriteLine("成绩超出范围!");
            }
        }
        /// <summary>
        /// 构造函数一键赋值
        /// </summary>
        /// <param name="name"></param>
        /// <param name="sex"></param>
        /// <param name="age"></param>
        /// <param name="cGrade"></param>
        /// <param name="uGrade"></param>
        public Student(String name, String sex, int age, float cGrade, float uGrade)
        {
            Name = name;
            this.sex = sex;
            Age = age;
            CGrade = cGrade;
            UGrade = uGrade;
            SHi();
            Grade();

        }
        /// <summary>
        /// 问候方法
        /// </summary>
        /// 
        public void SHi()
        {
            Console.WriteLine("我是{0},今年{1},性别{2}", Name, Age, Sex);
        }
        /// <summary>
        /// 成绩计算方法
        /// </summary>
        /// <param name="args"></param>
     
        public void Grade()
        {
            Console.WriteLine("总分为{0},平均分为{1}", CGrade + UGrade, (CGrade + UGrade) / 2);
 
            Console.WriteLine(A);
        }
        static void Main(string[] args)
        {
            Student A = new Student("张三", "男", 18, 90, 56);
        }

    }
    #endregion

🎶(E)封装-索引器


  • 实践经验

    1.通过索引器的索引对类中的成员进行便捷操作
    2.class Person ; person A = new person() ; A[1] = 2 ;
    3.模拟构造了用索引器的容器
    【Unity之c#专题篇】—核心章题单实践
  • 便捷操作
    //定义一个 Name 属性来操作 name 字段
    public string Name
    {
        set { name = value; }
        get { return name; }
    }

    //定义一个 Password 属性来操作 password 字段
    public string Password
    {
        set { password = value; }
        get { return password; }
    }

    //定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1
    public string this[int index]
    {
        get
        {
            if (index == 0) return name;
            else if (index == 1) return password;
            else return null;
        }
        set
        {
            if (index == 0) name = value;
            else if (index == 1) password = value;
        }
    }
}

  • 拟构容器
class INT
    {
        private int[] arrary;
        private int cerioty ;
        public int length;
        public INT() //构造函数中初始化
        {
            arrary = new int[cerioty];
            cerioty = 5;
            length = 0;
        }
        public int this[int index]
        {
            get
            {
                if (index > length) Console.WriteLine("越界!");
                return arrary[index];
            }
            set
            {
                arrary[index] = value;
                length++;
            }
        }
        //增
        public void Add(int vaule)
        {
            if(length+1 < cerioty )
            arrary[length++] = vaule;
            //进行扩容操作
            else              
            {
                cerioty *= 2;
                int[] tempArray = new int[cerioty];
                for (int i = 0; i < length; i++)
                {
                    tempArray[i] = arrary[i]; //值全部先放过去
                }
                arrary = tempArray;          //然后地址变更成新地址 ,旧的空间变成垃圾回收
            }
            
        }
        //删
        public void Remove(int index)
        {
            if(arrary[index]!=null)
            {
                arrary[index] = 0;
            }
        }
        static void Main(string[] args)
        {
            INT A = new INT();
            A.Add(666);
            A.Add(999);
            A[0] = 250;
            Console.WriteLine(A[0]+" "+A[1]+" "+A[2]+" "+A[3]);
        }
    }


🎶(F)封装-静态成员


  • 实践经验

    1.静态函数不能直接调用非静态成员
    2.在单例模式中的应用

单例模式的实现‘

【Unity之c#专题篇】—核心章题单实践

   class MathS
    {
        private static MathS m; //2.此时外部可以访问并且只有一个该对象存在,因为它在该对象内部实例化了
                                //但是外部还是可以修改为NULL,就达不到第三个条件通过类名点出来得到唯一的对象
        public int secret = 10;
        public static MathS M//3.通过属性只返回一个唯一实例化的对象,就可以实现第三部分直接通过类名点出来得到唯一的对象并且不可被修改
        {
            get
            {
                return m = new MathS();
            }
        }
        private MathS() //1.构造函数变成私有,此时外部无法进行实例化
        {

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(MathS.M.secret);
        }
    }

🎶(G)封装-静态类和静态构造函数


  • 实践经验

    1.静态类两大特点的底层原因:存储于静态存储区,所以和堆区栈区的操作就无关了
    2.静态构造函数的三大特点也是如此:三无,只构造静态变量,码字时就分配了空间
   static  class MathS //静态类测试
    {  
        static  float   CArea( float a ,float b)
        {
            return a * b;
        }
        static void Main(string[] args)
        {
            MathS.CArea(2.0f, 3.0f);
        }
    }
    class Self  //静态构造函数测试
    {
        static int a;
       static Self () 
        {
            a = 2;
        }       //现在已经赋值了
        Self () //此时还需实例化后才能赋值
        {
            a = 2;
        }
    }

🎶(H)封装-拓展方法


  • 实践经验

    1.声明定义的条件:无泛型的静态类中的静态方法
    2.声明时有参和无参在调用时的区别,和对于格式的理解
    static public void xx( this int yy)

【Unity之c#专题篇】—核心章题单实践
【Unity之c#专题篇】—核心章题单实践

  #region 拓展自杀的方法
    // class Player
    // {
    //     string name;
    //     int blood;
    //     int tacket;
    //     int defens;
    //     public void Hit()
    //     {

    //     }
    //     public void Move()
    //     {

    //     }
    //     public void Heart()
    //     {

    //     }
    // }
    //static  class Running
    // {
    //    static  public void KillSelf(this Player a)
    //     {
    //         Console.WriteLine("我自杀了");
    //     }
    //     static void Main(string[] args)
    //     {
    //         Player boss = new Player();
    //         boss.KillSelf();
    //     }
    // }

    #endregion
    #region      拓展求平方的方法

  static class Programe
    {

        static public int PinFan( this int A)
        {
            return (int)Math.Pow(A, 2);
        }

        static void Main(string[] args)
        {
            int a = 10;
           Console.WriteLine( a.PinFan());
        }

    }

    #endregion

🎶(III)封装-运算符重载


  • 实践经验

    1.熟悉怎么声明一个运算符重载的静态方法
    2.&&,|| , = ,三目运算符等运算符无法重载,逻辑运算符需要成对的重载方法

【Unity之c#专题篇】—核心章题单实践

 #region  _运算符重载 25
 
    class Vector3
    {
        public int x, y, z;
        /// <summary>
        /// 三维向量得加法
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        static public Vector3 operator +(Vector3 a ,Vector3 b)
        {
            Vector3 c = new Vector3();
            c.x = a.x + b.x;
            c.y = a.y + b.y;
            c.z = a.z + b.z;
            return c;
        }
        /// <summary>
        /// 三维向量的减法
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        static  public Vector3  operator -(Vector3 a, Vector3 b)
        {
            Vector3 c = new Vector3();
            c.x = a.x - b.x;
            c.y = a.y - b.y;
            c.z = a.z - b.z;
            return c;
        }
        /// <summary>
        /// 三维向量的乘法
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        static public Vector3 operator -(Vector3 a, int b)
        {
            Vector3 c = new Vector3();
            c.x = a.x * b;
            c.y = a.y * b;
            c.z = a.z * b;
            return c;
        }
    }

    class Program
    {
        struct S_PD //用结构体定义的方式来实现运算符重载
        {
            public int x1, x2;
            static public bool operator +(S_PD a, S_PD b)
            {
                if (a.x1 == b.x1 && a.x2 == b.x2)
                {
                    return true;
                }
                return false;
            }
        }
        public int x1,x2;
        public static bool operator +( Program a ,  Program b)
            {        
            if (a.x1 == b.x1 && a.x2 == b.x2 ) return true;
            return false;
            }
        static void Main(string[] args)
        {
            Program a = new Program();
            Program b = new Program();
            S_PD A = new S_PD();
            S_PD B = new S_PD();
            a.x1 = 1; b.x1 = 1;
            a.x2 = 2; b.x2 = 2;
            A.x1 = 3; B.x1 = 4;
            A.x2 = 3; B.x2 = 1;
            Console.WriteLine(a + b);
            Console.WriteLine(A + B);

        }
    }
    #endregion

🎶(III)继承


  • 实践经验

    1.父类中私有的可以被继承但是不能被调用
    【Unity之c#专题篇】—核心章题单实践
  /// <summary>
    /// 人类
    /// </summary>
    class Person
    {
       public  String name;
       public  int Age { get; set; } 
       public  void Speak()
        {
            Console.WriteLine("我会说英语");
        }
    }
    /// <summary>
    /// 战士类继承人类
    /// </summary>
    class Fighter : Person 
    {
       public  void  attent()
        {
            Console.WriteLine("我具有攻击性");
        }
    }
    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //第27题
            Fighter boss = new Fighter();
            boss.name = "牛魔王";
            boss.Age = 32;
            boss.Speak();
            boss.attent();
        }
    }


🎶(J) 继承-里氏替换原则


  • 实践经验

    1.父类装载子类,可以通过父类调用子类的方法(里氏替换原则)
    注意:装载后子类中能调用的只能是重写父类的方法
    2.is和as的使用(里氏替换原则)
    注意:用is判断之后,用子类对象装载as转换后的结果
    【Unity之c#专题篇】—核心章题单实践
  //29题
    /// <summary>
    /// 怪物基类
    /// </summary>
    class Monster
    {
        virtual public void attend()
        { }
    }
    /// <summary>
    /// 派生类boss类
    /// </summary>
    class Boss : Monster
    {
        override public void attend()
        {
            Console.WriteLine("Boss释放技能");
        }
    }
    /// <summary>
    /// 派生类小怪类
    /// </summary>
    class Goblin : Monster
    {
        override public void attend()
        {
            Console.WriteLine("Goblin普通攻击");
        }
    }
    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //第28题 : //is是类型所属判断操作符,as是引用类型转换操作符
            //第29题
            Random rand = new Random();
            int flag;
            Monster[] totall = new Monster[10];
            for (int i = 0; i < 10; i++)
            {
                if (rand.Next(2) == 1)
                {
                    totall[i] = new Boss(); //用父类装子类——里氏替换原则
                }
                else
                {
                    totall[i] = new Goblin();
                }
            }
            foreach (var item in totall)
            {
                item.attend();
                //as 和 is 的调用搭配
                //if (item is Boss) (item as Boss).attend();
                //else if (item is Goblin) (item as Goblin).attend();   
            }
        }
    }
    //30题 FPS游戏模拟
 //30题 FPS游戏模拟
    //武器类
    class Weapon
    {

    }
    //冲锋枪类
    class SubmachineGun : Weapon
    { }
    //散弹枪类
    class ShotGun:Weapon
    { }
    //手枪类
    class Pistol :Weapon
    { }
    //匕首类
    class Dagger:Weapon
    { }
    class Player
    {
        public Weapon knif;
        public Weapon Gun { get; set; }
        public Player() //默认武器为匕首
        {
            knif = new Dagger();
        }
        public void steadGun( Weapon gun) //替换武器
        {
            Gun = gun;
        }
    }

🎶(K)继承-构造函数


  • 实践经验

    1.继承时构造函数默认的调用顺序
    2.通过base 和 this 巧妙的调节继承时构造函数的 调用顺序
    【Unity之c#专题篇】—核心章题单实践
 /// <summary>
    /// 打工人基类
    /// </summary>
    class Worker
    {
    
        public String Jobs { get; set; }
        public String Contain { get; set; }
        virtual  public void Method() { } 
    }
    /// <summary>
    /// 程序员类
    /// </summary>
    class Programmer : Worker
    {
        public Programmer(String job,String contain )
        {
          
            Method();
        }
        public override void Method()
        {
            Console.WriteLine("我打代码");
        }
    }
    /// <summary>
    /// 策划类
    /// </summary>
    class Mastermind :Worker
    {
        public Mastermind(String job, String contain)
        {
            Jobs = job;
            Contain = contain;
            Method();
        }
        public override void Method()
        {
            Console.WriteLine("我搞策划");
        }
    }
    /// <summary>
    /// 美术类
    /// </summary>
    class Art:Worker
    {
        public Art(String job, String contain)
        {
            Jobs = job;
            Contain = contain;
            Method();
        }
        public override void Method()
        {
            Console.WriteLine("我美术设计");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Programmer garmmer = new Programmer("程序员","打代码");
            Mastermind master = new Mastermind("策划员", "搞策划");
            Art art = new Art("ui设计师", "美术设计");
        }
    }

🎶(L)继承-万物之父


  • 实践经验

    1.拆箱装箱的本质是值类型和引用类型的相互转换
    2.好处和坏处(有利于不确定对象的装载,但是跨存储区的转换消耗性能)
    【Unity之c#专题篇】—核心章题单实践
    //口头描述拆箱装箱:
    //1.装箱 : 将值类型的对象装在Object基类(引用类型)中的行为叫装箱
    //2.拆箱 : 将装好的Object对象进行强制转换成值类型的行为叫拆箱
    //
    class Program
    {
        static void Main(string[] args)
        {
            object god;
            int mm = 2;
            god = mm;//装箱
            //拆箱
            int zz = (int)god;
        }
    }

🎶(M)继承-综合练习


  • 实践经验

    1.当继承有参构造函数时直接用base关键字
    2.面向对象本质就是拿现实来看待问题。定义特征和抽象行为,从现实生活的角度用代码创造生活的一切
    【Unity之c#专题篇】—核心章题单实践
 /// <summary>
    /// 定义基类Person
    /// </summary>
    class Person
    {

     public  String name { get; set; }
     public Person ()
     {

     }
     public  Person (String name )
        {
            this.name = name;
        }
    }

    class Drive:Person //司机类
    {
     
    }
    class Passgener:Person//乘客类
    {

    }
    class Car
    {
         public int velocity; 
         public int number = 1;
        private int capacity { get; } = 20;
        private int maxVelocity { get; } = 200;
        public Person driver;
        public Person [] constorm  ;    
        public Car()
        {
            constorm = new Person[capacity];
            driver = new Person("张三");
            constorm[0] = driver;
        }
        public void GoCar(Person passenger)   //上车的行为
        {
            if(number<20)
            {
                Console.WriteLine("乘客上车");
                constorm[number++] = passenger;
            }
            else
            {
                Console.WriteLine("已满载!");
            }
        }
        public void ExitCar(Person passenger) //下车的行为
        {
            Console.WriteLine("乘客下车");
            constorm[number--] = null ;
        }
        public void Driving()                //开始行驶的行为
        {
            Console.WriteLine("车辆开始行驶");
            velocity = 20;
        }
        public void Accident()              //发生事故的行为      
        {
            Console.WriteLine("车辆发生事故");
            velocity = 0;
            number = 0;
        }
        public void StateCar()             //车辆情况汇报系统
        {
            Console.WriteLine("此时车辆的状况如下:\n车辆速度:{0}\n 车辆人数:{1}", velocity, number);
        }
    }
    /// <summary>
    /// 车辆新闻人播报
    /// </summary>
class NewsPeople
    {
        static void Main(string[] args)
        {
            Car BWM = new Car();
            BWM.GoCar(new Person ("郭富城"));
            BWM.Driving();
            BWM.StateCar();

        }
    }

🎶(N)多态



🎶(O)多态-虚方法,重写,base


  • 实践经验

    1.编译时的多态是重载
    2.运行时的多态是重写,虚方法,base,抽象类和抽象接口
    3.虚方法可选择性重写
    【Unity之c#专题篇】—核心章题单实践
  #region 1.鸭子的叫法,利用重写体现多态
    class Duck
    {
        virtual public void Speak() {  }
    }
    class RealDuck:Duck
    {
        override public void Speak()
        {
            Console.WriteLine("嘎");
        }
    }
    class WoodDuck:Duck
    {
        override public void Speak()
        {
            Console.WriteLine("吱");
        }
    }
    class RubberDuck:Duck
    {
        override public void Speak()
        {
            Console.WriteLine("叽");
        }
    }
    #endregion
    #region 2.员工打卡,利用重写体现多态
    class Worker
    {
        virtual public void Sign()
        {
            Console.WriteLine("我是员工九点打卡");
        }
       
    }
    class Massger:Worker
    {
        override public void Sign()
        {
            Console.WriteLine("我是经理十一点打卡");
        }
    }
    class Programme:Worker
    {
        override public void Sign()
        {
            Console.WriteLine("我是程序员我不打卡");
        }
    }
    #endregion
    #region 3.利用重载体现多态
    class Graphic
    {
       virtual  public void Area() { }
       virtual  public void Circumference() { }
    }
    class Rectangle:Graphic 
    {
         public int Area(int heiht,int wigth)
        {
            return heiht * wigth;
        }
        public  int  Circumference(int heiht, int wigth)
        {
            return 2 * (heiht + wigth);
        }
    }
    class Round : Graphic
    {
        public float  Area(int Side)
        {
            return 2 * 3.14f * Side;
        }
        public float  Circumference(int Side)
        {
            return (float )Math.Pow(Side, 2)*3.14f;
        }
    }
    class Square :Graphic
    {
        public int Area(int Radius)
        {
          return (int)Math.Pow(Radius , 2);
        }
        public int  Circumference(int Radius)
        {
            return 4 * Radius;
        }
        class Progeam
        {
            static void Main(string[] args)
            {
                Rectangle MM = new Rectangle();
                Square NN = new Square();
                Round OO = new Round();
                Console .WriteLine ("矩形的面积为:"+ MM.Area(2, 3));
                Console.WriteLine("矩形的周长为:"+MM.Circumference(2, 3));
            }
        }
    }
    #endregion

🎶(P)多态-抽象类和抽象方法


  • 实践经验

    1.抽象类抽象方法必须被重写,抽象方法没有函数体
    2.抽象类不能被实例化但是遵从里氏替换原则
    3.什么时候用抽象类,比如动物类,图形类这种抽象未落地的事务就可以用抽象类

【Unity之c#专题篇】—核心章题单实践

#region 动物抽象类
    abstract class Animal
    {
        abstract public void Speak();
    }
    class Person:Animal
    {
        public override void Speak()
        {
            Console.WriteLine("你干嘛"); 
        }

    }
    class Dog:Animal 
    {
        public override void Speak()
        {
            Console.WriteLine("汪汪汪");
        }
    }
    class Cat:Animal
    {
        public override void Speak()
        {
            Console.WriteLine("喵喵喵");
        }
    }
    #endregion
    #region 图形类
   abstract  class Circle
    {
        //抽象函数不能有方法体,并且是公共的
        abstract public int Area(int a ,int b);
        abstract public int Perimeter(int a,int b);
    }
    class Rectangle :Circle
    {
        public override int Area(int a,int b)
        {
            return a * b;
           
        }
        public override int Perimeter(int a,int b)
        {
            return 2 * (a + b);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //抽象类存在里氏替换原则
            Circle Round = new Rectangle();
            Dog Hashiqi = new Dog();
            Console.WriteLine(Round.Area(1, 3));
        }
    }
    #endregion

🎶(Q)多态-接口


  • 实践经验

    1.接口中只能有(无函数体的方法,属性,事件。索引器)
    2.接口方法不需要public修饰,它默认就是public
    3.接口就是抽象一个共用的功能,谁继承即可学习(相当于恶魔果实)
    4.接口继承接口不用全部实现其中成员
    5.接口用里氏替换原则做父类装class
    【Unity之c#专题篇】—核心章题单实践
    【Unity之c#专题篇】—核心章题单实践

   #region 继承登记功能接口
    interface IRigster
    {
        //接口中不含变量可包含,无函数体的方法,属性,索引器,事件
        //接口方法不需要public修饰,它默认的就是pulic
        void RigsterMessage(); 
    }
    class Person : IRigster
    {
        public void RigsterMessage()
        {
            Console.WriteLine("派出所登记");    
        }
    }
    class Hourse : IRigster
    {
        public void RigsterMessage()
        {
            Console.WriteLine("房管局登记");
        }
    }
    class Car : IRigster
    {
        public void RigsterMessage()
        {
            Console.WriteLine("车管所登记");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //利用里氏替换原则
            IRigster[] Rigster = new IRigster[3] { new Person(), new Hourse(), new Car() };
            for (int i = 0; i < Rigster.Length ; i++)
            {
                Rigster[i].RigsterMessage();
            }
        }
    }
    #endregion
    #region 继承飞行,游泳,走路的功能接口
    interface IFly
    {
        void Flay();
    }
    interface ISwim
    {
        void Swim();
    }
    interface IWalk
    {
        void Walk();
    }
    abstract class Bird : IFly, IWalk
    {
        abstract public void Flay();


        abstract public void Walk();

    }
    class MaQue : Bird
    {
        public override void Flay()
        {
            Console.WriteLine("我是麻雀可以飞");
        }

        public override void Walk()
        {
            Console.WriteLine("我是麻雀也可以走");
        }
    }
    class YinWU : Bird
    {
        public override void Flay()
        {
            Console.WriteLine("我是鹦鹉可以飞");
        }

        public override void Walk()
        {
            Console.WriteLine("我是鹦鹉也可以走");
        }
    }
    class TiamE : Bird, ISwim
    {
        public override void Flay()
        {
            Console.WriteLine("我是天鹅可以飞");
        }

        public void Swim()
        {
            Console.WriteLine("我可以游泳");
        }

        public override void Walk()
        {
            throw new NotImplementedException();
        }
    }
    class TuoNiao : IWalk
    {
        public void Walk()
        {
            Console.WriteLine("我可以走");
        }
    }
    class QIE : IWalk
    {
        public void Walk()
        {
            Console.WriteLine("我可以走");
        }
    }
    class Plan : IFly
    {
        public void Flay()
        {
            Console.WriteLine("我可以飞");
        }
    }
    #endregion

【Unity之c#专题篇】—核心章题单实践

  interface IUSB
    {
        void ReadState();
    }

    class MoveSave : IUSB
    {
        private string name;

      public   MoveSave (string name )
        {
            this.name = name;
        }
        public void ReadState()
        {
            Console.WriteLine(name +"可以进行传输");
        }
    }
    class MP3 : IUSB
    {
        public void ReadState()
        {
            Console.WriteLine("可以进行传输了");
        }
    }
    class Computer 
    {
        public IUSB flacity;  //传输接口作为变量
  
    }
    class Program
    {
        static void Main(string[] args)
        {
            MoveSave USave = new MoveSave("U盘");
            MoveSave Msove = new MoveSave("移动硬盘");
            MP3 Xmp3 = new MP3();
            Computer XMi = new Computer();
            XMi.flacity = USave;  //里氏替换原则,接口作为父类装了类的子类
            XMi.flacity.ReadState();

        }
    }

🎶(R)面向对象相关-命名空间


  • 实践经验

    1.要引用其他项目的命名空间时,在解决方案中添加需要项目的引用
    2.相同命名空间有同名类时用命名空间+”."的格式进行区分

【Unity之c#专题篇】—核心章题单实践

【Unity之c#专题篇】—核心章题单实践

//当引用其他项目的命名空间时
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UI;
using Graph;
namespace _命名空间Text
{
    class Program
    {
        static void Main(string[] args)
        {
               UI.Image a = new UI.Image();
            Graph.Image b = new Graph.Image();
        }
    }
}

🎶(S)面向对象相关-Object的方法


  • 实践经验

    1.七个方法:两个静态方法(判断两个对象,判断两个引用对象)
    两个普通方法(得到运行时返回的类型,浅拷贝引用对象)
    三个虚方法(自定义判断规则,自定义返回的Tostring,自定义返回的哈希码)
    2.以下是虚方法重写制定Tostring 和 浅拷贝引用对象(A变B不变)
    【Unity之c#专题篇】—核心章题单实践
  class Player
    {
        string name;
        int blood;
        int attack;
        int defens;
        //重写万物之父中的ToString方法
        public override string ToString()
        {
            return "玩家"+name+"血量"+blood+"攻击力"+attack+"防御力"+defens;
        }
    }
    class Monster
    {
     public   int attack = 10;
        int defend = 20;
        int blood = 30 ;   

        public object Man()
        {
            return new Monster().MemberwiseClone();
            //适合给引用对象实施浅拷贝——A变B不变
        }
        public void print()
        {
            Console.WriteLine(attack +" "+defend+" "+blood );
        }
    }
    class Program
    {
       static void Main(string[] args)
       {
           // Player text = new Player();
           // Console.WriteLine(text.ToString());
            Monster A = new Monster();
            Monster B = A.Man() as Monster ; //as比()更安全-引用对象
            B.attack = 30;
            B.print();
            A.print();  
       }  
    }

🎶(T)面向对象相关-String


  • 实践经验

    1.七个API:拼接Format,替换Replace,截取Substring,移除Remove,查找Indexof,切割Split,大小写转换ToUpper/Tolower
    2.String是特殊的引用类型,你变它不变,原因是它已经自己来开辟了空间
    3.使用拼接一般会在堆里面开辟三个空间
    4,所以它的缺点就是多次赋值开辟空间浪费了空间
    【Unity之c#专题篇】—核心章题单实践
  • 第50题: 开辟了3个堆的空间(= null的时候不开辟,“123”是存在常量池中)
  • 第49题: String和string,int32和int 前者是Framwork当中的类,后者可以映射成为前者,最好写后者

        //string中的截取方法:a.Split();
        //string中的替换方法:a.replace();
        //string中的移除方法:a.Remove();
        //string中的拼接方法:String.Format();

        //
        static void Main(string[] args)
        {
            string a = "1|2|3|4|5|6|7";
            string [] b = a.Split('|');
            string c = "";
            
          
            for (int i = 0; i < b.Length ; i++)
            {
                b[i] = (int.Parse(b[i])+1).ToString() ;
                if(i < b.Length )
               c= string.Format("{0}{1}{2}",c,b[i],'|');
        }


            Console.WriteLine(c);
        }

🎶(U)面向对象相关-优化内存


  • 减少new的使用
  • 减少GC回收机制的运行
  • 合理使用static(static与程序同生共死,不会受GC回收影响)
  • 合理的使用String 和StringBuilder

⭐相关文章⭐

⭐本站最全-unity常用API大全(万字详解),不信你不收藏

⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随

⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!文章来源地址https://www.toymoban.com/news/detail-452541.html

到了这里,关于【Unity之c#专题篇】—核心章题单实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法 | 背包专题】分组背包(解题思路+题单)

    上一节,我们提到了什么是01背包,以及如何求解01背包: 【算法 | 背包专题】01背包(状态定义+状态转移+解题流程+题单) 现在,我们来看分组背包。 分组背包问题是背包问题的一种变形。在这个问题中, 物品被分成了若干组 ,每组中的物品相互冲突,也就是说, 每组只

    2024年04月11日
    浏览(39)
  • 【Unity-c#专题篇】之c#入门篇

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity之c#专题篇 ⭐[【Unityc#专题篇】之c#进阶篇】 ⭐【Unityc#专题篇】之c#核心篇】 ⭐【Unityc#专题篇】之c#基础篇】 ⭐【Unity-c#专题篇】之

    2024年01月21日
    浏览(32)
  • 【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ | 洛谷 | acwing)

    【DFS专题】优质题单推荐 10道题(C++ | 洛谷 | acwing) 来自b站大佬的题单 题单链接 每个位置选什么数 与全排列的差别就是第二个for循环开始的位置,换句话说就是每个数该放什么位置。 参数 : 前u个数 选 or 不选 的 需要保存第x位置的状态的时候就需要用st数组来存状态 i

    2023年04月08日
    浏览(50)
  • Unity学习笔记(零基础到就业)|Chapter03:C#核心

    这系列的学习笔记主要是根据唐老狮的unity实战路线课程整理的,加入了自己的一些补充和理解,该课程涉及的知识内容非常多,我并未学完,而是根据就业需求挑选学习的,也对后续框架部分进行了一些修改,希望能通过整理并时常阅读这些笔记巩固开发知识,也希望能跟

    2024年02月20日
    浏览(60)
  • 【Spring专题】Spring底层核心原理解析

    Spring啊,可以说是我们大部分Java玩家【最熟悉的陌生人】了吧。八个字形容:似懂非懂,会也不会 你说简单应用,我们大家都会,那真要展开说两句的话,那只能来这么两句:这是第一句,接着是第二句,好了我说完了。 但是啊xdm, 据说Spring是一份非常非常非常优秀的源码

    2024年02月13日
    浏览(47)
  • 【Kafka专题】Kafka收发消息核心参数详解

    在Kafka中,对于客户端和服务端的定义如下: 客户端Client: 包括消息生产者 和 消息消费者 服务端:即Broker,Broker:一个Kafka服务器就是一个Broker 首先,先引入客户端maven依赖 1.1 消息发送者源码示例 然后可以使用Kafka提供的客户端——Producer类,快速发送消息。 看上面的源

    2024年02月03日
    浏览(42)
  • 【Spring专题】Spring之底层架构核心概念解析

    本节课的内容,是后续看Spring源码所必备的概念、类精讲,防止后续看源码的过程中,遇到不会的、看不懂的还得单独跳出来学习。所以,大家好好理解一下这些概念,可以大大地帮助后学源码阅读。 另外还有一点需要 特别声明 : 接口的作用,有时候是用来约束、规范行为

    2024年02月13日
    浏览(36)
  • VM图像类型转换专题(C#)

    VisionMaster(后简称VM)作为一款功能强大的工业图形图像处理软件,可对工业中遇到的各种图像进行处理,同时还有功能强大的算子以及很全面的例程,作为图像处理的主程序是非常不错的。当前VM提供了VM算法平台、VM SDK开发、算子SDK开发和算子模块开发四种开发模式兼顾各

    2024年02月16日
    浏览(41)
  • 【Unityc#专题篇】之c#进阶篇

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity之c#专题篇 ⭐[【Unityc#专题篇】之c#进阶篇】 ⭐【Unityc#专题篇】之c#核心篇】 ⭐【Unityc#专题篇】之c#基础篇】 ⭐【Unity-c#专题篇】之

    2024年02月09日
    浏览(37)
  • PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法

    在 dump 分析旅程中,经常会遇到很多朋友反馈一类问题,比如: 方法平时都执行的特别快,但有时候会特别慢,怎么排查? 我的方法第一次执行特别慢,能看到慢在哪里吗? 相信有朋友肯定说,加些日志不就好了,大方向肯定是没问题的,但加日志的颗粒度会比较粗而且侵

    2024年02月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包