车辆类和向量类,private和public的访问权限控制,构造函数,属性,属性的匿名
013-车辆类和向量类的定义和使用
Customer c1 = new Customer();
Customer c2 = new Customer();
c1.name = "张三";
c2.name = "李四";
c1.Show();
c2.Show();
这段代码输出的内容:
名字张三
地址
年龄0
办卡时间
名字李四
地址
年龄0
办卡时间
- 对象是可以有多个的(c1c2),但是类只能有一个类
定义一个车辆类
类的定义和声明
定义⼀个⻋辆(Vehicle)类,具有Run、Stop等⽅法,具有Speed(速度)、
MaxSpeed(最⼤速度)、Weight(重量)等域(也叫做字段)。
使⽤这个类声明⼀个变量(对象)
添加类的时候不需要添加后缀
class Vehicle
{
//先给类添加数据
public string brand;
public int speed;
public int maxSpeed;
public float weight;
//接下来添加车辆类的功能
public void Run()
{//通过输出模拟车辆正在进行的功能
Console.WriteLine("车辆跑起来了");
}
public void Stop()
{
Console.WriteLine("车辆停止了");
}
}
以上是车辆类的创建
然后回到Program.cs中使用这个类
Vehicle car1 = new Vehicle();//先声明
//可以直接给车辆类赋值,也可以直接用功能让他跑起来
car1.Run();//输出 车辆跑起来了
car1.Stop();//输出 车辆停止了
定义一个向量类
定义⼀个向量(
Vector3)类,⾥⾯有x,y,z三个字段,有取得⻓度的⽅法,有设置属性
(Set)的⽅法
使⽤这个类声明⼀个变量(对象)
//首先还是给数据 三个字段
private float x;
private float y;
private float z;
//取得向量的长度
//需要使用Math.Sqrt方法
public double Length()
{
return Math.Sqrt(x * x + y * y + z * z);
}
- 创建数据时私有和共有的区别
public和private的区别
private的数据只能在当前类里访问,在其他类里不可访问
而public在其他类里也可以访问
public的数据相当于把密码写在脸上,别人可以直接知道,而private的数据需要间接访问
//利用一个Set方法让数据可以被间接访问到
public void SetX(float temp)
{
x = temp;//这样的话外界可以调用数据temp,而temp的值和x是一样的
}
以上操作重复三次
//利用一个Set方法让数据可以被间接访问到
public void SetX(float temp)
{
x = temp;//这样的话外界可以调用数据temp,而temp的值和x是一样的
}
public void SetY(float temp)
{
y = temp;
}
public void SetZ(float temp)
{
z = temp;
}
014-public和private访问权限控制
ector3 v1 = new Vector3();
v1.SetX = (3.4f);
v1.SetY = (1.5f);
v1.SetZ = (0.5f);
Console.WriteLine(v1.Length());
调用设置好的间接数据函数
因为间接数据是一个函数,所以在函数里有更多操作空间
控制数据位置在第一象限的代码示例
public void SetX(float temp)
{
if (temp < 0)//控制x轴为正数,如果不是,则x的值,不变
{
return;
}
x = temp;//这样的话外界可以调用数据temp,而temp的值和x是一样的
}
public void SetY(float temp)
{
if (temp < 0)
{
return;//保证y>0,结合上面的x>0,就能让位置在第一象限了
}
y = temp;
}
public void SetZ(float temp)
{
if (temp < 0)
{
return;
}
z = temp;
}
用Set设置完之后还需要对应的 Get 方法来访问值
//设置完之后还需要对应的 Get 方法来访问值
public float GetX()
{
return x;
}
public float GetY()
{
return y;
}
public float GetZ()
{
return z;
}
进一步使用的案例
比如年龄这种数据,不能出现负数
那么就使用public一个函数来做限制
private int age;
//条件控制 set+get
public void setAge(int temp)
{
if (temp < 0)
{
return;
}
age = temp;
}
public int getAge()
{
return age;
}
使用
Customer list = new Customer();
//list.age=-10
list.setAge(-10);//做过条件限制之后,就算设置了负数,也会显示0,因为值被返回相当于没有赋值
list.Show();
构造函数
我们构造对象的时候,对象的初始化过程是⾃动完成的,但是在初始化对象的过程中有的
时候需要做⼀些额外的⼯作,例如需要初始化对象存储的数据,构造函数就是⽤于初始化
数据的函数。
声明基本的构造函数的语法就是声明⼀个和所在类同名的⽅法,但是该⽅法没有返回类
型。
public class MyClass{
public MyClass(){
这个构造函数的函数体
}
}
说明:在我们为对象赋值的时候,所有对象的数据都是按照基本类型来赋值的
- 值类型 - 默认值 0
- 引用类型 - 默认值 null
//构造函数示例
public Customer()
{
Console.WriteLine("我是构造函数");
}
说明:其实每个类都一定需要构造函数,但是为什么我们创建过很多类但是都没有写过构造函数?
因为,当我们不主动写构造函数的时候,系统会自动生成一个默认的 五参的 构造函数
当我们创建、调用对象的时候,就会使用到构造函数
构造函数使用的演示
Customer list = new Customer();//我们并没有给数据赋值,只是定义了这个数据,但是会打印出"我是构造函数"
//构造函数 让 类 里的 默认值 改变了
一般我们使用构造函数是为了初始化数据的,构造函数可以被多次调用
多次调用的示例
Customer list1 = new Customer();//我们并没有给数据赋值,只是定义了这个数据,但是会打印出"我是构造函数"
//构造函数 让 类 里的 默认值 改变了
Customer list2 = new Customer();
Customer list3 = new Customer();
输出:
我是构造函数
我是构造函数
我是构造函数
请按任意键继续. . .
- arg - 参数
用构造函数初始化的示例:
public Customer(string arg1, string arg2, int arg3, string arg4)//把四个数据给到构造函数的参数上
{
name = arg1;
address = arg2;
age = arg3;
creatTime = arg4;
}
Customer zhangsan = new Customer("张三","天美",80,"忘了");//在括号里直接给到参数
zhangsan.Show();//让张三把自己的信息显示出来
输出:
名字张三
地址天美
年龄80
办卡时间忘了
请按任意键继续. . .
可以存在多个构造函数
选择匹配的,从上往下调用
Customer list1 = new Customer();
list1.Show();
即使已经写了四个参数的构造函数,但是如果不主动给参数的话,还是会自动调用
输出:
我是构造函数//这是第一个构造函数,总共两个
名字
地址
年龄0
办卡时间//所有的数据都是没有的
总结:构造函数可以有多个,构造函数类名和函数名是一致的,构造函数没有返回值
016-构造函数的参数问题
注意:
- new一个对象的时候,必须要找到对应的构造方法
说明:如果把五参的构造方法去掉,在使用的时候就不能new五参的新变量了
- 用arg1,arg2,arg3…之类的方式命名构造函数非常不容易理解,所以最好用见名知意的方法命名构造函数,比如 name 就叫 name
问题:这个时候参数名和数据名重复了,该怎么赋值呢?
说明:通过this.解决,变量前加上this.之后,就代表着访问当前类里的成员
示例:
public Customer(string name, string address, int age, string creatTime)//把四个数据给到构造函数的参数上
{
//name = arg1;
//address = arg2;
//age = arg3;
//creatTime = arg4;
this.name = name;
this.address = address;
this.age = age;
this.creatTime = creatTime;
}
017-属性
using System;
using System.Collections.Generic;
using System.Text;
namespace _017_属性
{
class Customer
{
private string name;
private string address;
private int age;
private string createTime;
//用结构函数可以搞,但是有点麻烦
//public void SetAge(int age)
//{
// this.age = age;
//}
//public int GetAge()
//{
// return age;
//}
public void Show()
{
Console.WriteLine("名字:" + name);
Console.WriteLine("地址:" + address);
Console.WriteLine("年龄:" + age);
Console.WriteLine("办卡时间:" + createTime);
}
}
}
结构函数能搞,但是有点麻烦
以下是用属性实现的方法:
一般让属性跟成员名字一致,但是首字母大写
属性里包含:get和set
用正常方式访问,得到函数的值
Customer list = new Customer();
list.SetAge(23);
Console.WriteLine(list.GetAge());
使用属性的方法
Main函数部分
static void Main(string[] args)
{
Customer list = new Customer();
//list.SetAge(23);
//Console.WriteLine(list.GetAge());
//设置属性的值
list.Age = 34;//当你给Age赋值的时候,他就会调用set框
//访问属性里面的数据
Console.WriteLine(list.Age);//调用get方法
}
Customer函数的部分
public int Age
{
get
{
return age;
}
set//value参数
{
age = value;//通过value拿到赋值的值
}
}
很像get方法和set方法的简写版本
018-属性和匿名类型
属性里可以只有set和get
说明:这样就设置了属性的只读或者,只写
可以直接简写
get;set;
- 自动实现的属性
说明:没有添加int age数据成员,系统会自动创建一个数据成员
private string name;
private string address;
//private int age;
private string createTime;
//自动实现的属性
public string Name
{
get;set;
}
public int Age { get; set; }
注意:因为已经没有了成员的定义,所以后面在访问的时候,也需要通过属性去访问了
使用这个方式可以直接控制只读和只写的权限
匿名类型
说明:通过var指定,但是只声明变量名,不指定类型
当你给他说明,他就是什么类型,在初始化的时候决定类型,然后就不能修改了
int age = 12;
//匿名类型
var age2 = 45;
var name = "匿名";