C#第8天学习

114 阅读6分钟

练习题1

编写一个程序,定义结构(有姓名,年龄,手机号码三个字段),再定义一个一维数组,把结构作为数组元素类型,存入数据,然后依次输出。

Student student2;
            Student student3;
            student2.name = "小黑";
            student2.age = 12;
            student2.phone = 232472384;
            student3.name = "小白";
            student3.age = 112;
            student3.phone = 26666484;



            Student[] student = new Student[3] { student1, student2, student3 };   //用数组储存结构体,并遍历输出信息
            foreach(Student i in student){
                Console.WriteLine(i.name);
                Console.WriteLine(i.age);
                Console.WriteLine(i.phone);

一、面向对象

1.为什么要使用面向对象编程

我们可以将程序模块块,进行模块划分,每个模块提供特定的功能,这样每个模块都是独立的,互不影响,比如我们创建一个动物类,规定了所有动物都有走路的动能,或者性别的属性等等,如果我们想创建一个动物,比如猫,这个时候我们可以使用该类中有的方法和字段,那如果想创建一个狗对象同样可以用该类生成,同样也会有类中的方法,但这时候狗中的方法和属性都是独立和猫中的方法和字段互不影响,我们从这里可以明显看到面向对象可以提高代码的复用性,我不需要重复的定义函数和变量。

2.类是什么?

类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。

3.类的基本定义image.png

4.根据类创建对象

image.png

5.练习

image.png image.png

  public class Vehicle
    {//定义一个车辆类

        public Vehicle(int Speed, int MaxSpeed, int Weight)     //ctrl+alt 连续多选    ctrl+c     ctrl + v
        {//构造方法
            this.Speed = Speed;
            this.MaxSpeed = MaxSpeed;
            this.Weight = Weight;
        }//this.Speed 与Speed的区别    不是同一个



        public int Speed;
        public int MaxSpeed;
        public int Weight;

        public void Run()
        {

            Console.WriteLine("当前时速{0}, 最大速度为{1}", Speed, MaxSpeed);
        }

        public void Stop()
        {
            
            Console.WriteLine("当前速度为{0},最大速度为{1}", Speed, MaxSpeed);
        }
   static void Main(string[] args)
        {Vehicle cap;
            Vehicle bus;
            cap = new Vehicle(90, 150, 5000);
            bus = new Vehicle(60, 100, 100000);
            cap.Run();
            bus.Stop();
            }
      }
}

6.构造函数

1. 构造函数的作用

构造函数会在类构造对象的时候自动调用自己,我们一般用于初始化对象存储的数据,所以构造函数本质是用于初始化数据的函数

2. 构造函数的基本写法

构造函数是类中和类同名的一个方法,当创建对象的时候自动调用该方法,一般用于初始化数据image.png 构造函数中也可以调用对象中的方法,获取对象中的返回值存到对象的字段中 image.png

3.属性和字段

1.字段 image.png 2.属性的定义 image.png 3. 属性的特点

  • 访问属性和访问字段一样,当取得属性的值得时候,就会调用属性中的get块执行get块中的语句,所以get块需要一个返回值,类型就是属性的类型;当我们去给属性设置值得时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值 image.png 设置只读或者只写,如果我们给属性只设置get块那么就是只读,如如果只设置set块那么就是只写 4. 两个访问修饰符

  • public公开的的,访问最高权限

  • private私有的,只能在类或者结构体内部中使用 image.png

9.使用其他项目中的类

  1. 在本项目中引用其他项目中的命名空间,比如这里我们在demo01项目中引入_demo中的命名空间
  • 第一步image.png
  • 第二步image.png
  • 第三步image.png
  • 注意:想要使用其他项目中的命名空间中的类,那么该类的访问修饰符要设置为public公开的形式
  • 8.匿名类型

当我们不确定数据的类型的时候,我们可以使用关键字var声明变量,那么该变量的类型就由初始化赋的值决定,如果赋的是字符串那么就是字符串类型 image.png

9.类的继承

1.为什么需要继承

很多类在项目中可能有相似的数据,比如在一个游戏中Boss类和小怪类Enemy这些类有很多相同的属性,比如血量,攻击值等,所以这个时候我们可以使用继承来让这两个类继承自同个类

2.实现继承的写法image.png

3.base关键字

  • 当我们使用继承的时候,可能子类中也会有相同的属性和方法,但是有的时候我们就想使用父类中的属性和方法,这时候我们可以使用base关键字,base表示的就是父类,我们可以通过base.父类中的属性名来获取父类中的属性
  • image.png
  • base的第二个使用方式,将子类中的传进来的参数传递给父类的构造方法image.png

10.虚函数(重写父类中的方法)

  • image.png
  • 11.抽象类

1.为什么要有抽象类

比如我们讲的怪物可能都有一技能的,也就是说都会有一个一技能攻击的方法,但是每个怪物的一技能都不一样,有时候在编写项目的时候可能忘记编写子类中一技能的方法,我们可以定义一个抽象父类,抽象类是一个不完整的模板,因为里面有抽象函数,抽象函数可以理解为一个没有函数体的函数,那么我们在使用继承的时候,会提示你编写攻击的函数,否则就会报错,这样可以更加规范我们代码的编写

image.png 定义一个派生类继承抽象类中的方法,这时候会提示你要重写min方法 image.png 接点击提示,实现抽象类 image.png

12.常见访问修饰符的了解

  • public 访问的最高权限,允许在同个项目或不同的项目中被访问
  • private 只允许在类或结构中被访问
  • internal 只允许在同个项目中被访问
  • protected 只允许在同一个类或结构或者此类的派生类中被访问

13.密封类

当我们创建的类不想被继承的时候,我们可以在类前面加sealed修饰符表示该类无法被继承 image.png

14.其他修饰符

1.static 静态和非静态的区别:

  • 被static修饰的是静态成员,没有被static修饰的是非静态成员(实例成员)
  • 在静态类中可以有静态成员,也可以有非静态成员,但是静态类中只能有静态成员
  • 在类中,静态方法要调用的话只能通过类名.方法名,不能通过对象名.方法名调用 image.png 在静态函数中只能访问静态成员的数据,不能访问非静态成员(实例成员)的数据image.png 实例函数中既可以使用静态成员也可以使用实例成员

2.readonly 只能在声明和构造函数中初始化赋值,在其他地方不能修改其值,只能被读取,不能被修改

image.png

练习题image.png

using System;

namespace MyMath
{
    class MyMath
    {
        public const double PI = 3.14;

        public static void Perimeter(double r)
        {
            Console.WriteLine(2 * PI * r);
        }
        public static void Area(double r)
        {
            Console.WriteLine(PI * r * r);
        }
        public void Volume(double r)
        {
            Console.WriteLine(4 / 3 * PI * r * r * r);
        }

    }


    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("请输入半径:");
            double R = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("周长为:");
            MyMath.Perimeter(R);
            Console.WriteLine("面积为:");
            MyMath.Area(R);
            Console.WriteLine("体积为:");
            MyMath circle = new MyMath();
            circle.Volume(R);


        }
    }
}