第七章 类和对象
1.理解分类
英语里面的类(class)是分类(classification)的词根。设计类的过程就是对信息进行分类,将相关信息放到有意义的实体中。
人们用 “汽车” 一词泛指具有这些行为和属性的对象。只要所有人都认同一个词的意思,这个系统就能很好的发挥作用。
2.封装
封装是定义类时的重要原则。其中心思想是:使用类的程序不应关心类内部的、如何工作。
程序只需创建类的实例并调用类的方法。只要方法能做到它们宣称能做到的事情,程序就不关心它们具体如何实现。
封装有时称为信息隐藏,它实际有两个目的:
a: 将方法和数据合并到类中。
b: 控制对方法和数据的访问。
3.定义类
class PlayStation
{
int USB = 2;// 类中的变量称为字段。
//字段在类内部定义,位于PowerOn方法外部,所以具有类作用域,可由类的所有方法使用。
void PowerOn()
{
.....
}
}
使用new关键字,创建类的对象
PlayStation ps = new PlayStation()
类,是一种数据类型,称为类类型。如:基本数据类型int,是整数类型;double,是双精度浮点类型。
对象,是在程序运行时创建的。它以类为模板,在程序运行期间 new 关键字将类 PlayStation实体化。
类PlayStation,是设计出来的一个模板,不同的类设计可能不一样,程序运行期间根据模板
"造出" 一台有 "活力" 的PlayStation,它的名字叫做ps。
有活力的 ps, 它有两个USB接口,一个可以开机的方法PowerOn。程序关闭后,有活力的 ps 会被注销。
4.访问类的字段与方法
默认情况下,方法和数据封装到类中,就和外部世界划清了界限。
int number = 0;
Fish c = new Fish();
number = c.weigth; // 无法访问。 weight字段, weight字段默认被 private修饰,只能在类内部访问。
c.eat(); // 无法访问。 eat()方法默认被 private修饰,只能在类内部访问。
c.printWeight(); // 可以访问。 printWeight()方法为 public方法,类外部可以访问。
.....
class Fish
{
int weight = 6;
void eat()
{
.....
}
public void printWeight() => Console.WriteLine(weight); //类内部可以访问 weight
}
5.构造器
构造器的作用是初始化对象。它和类同名、没有返回值,创建对象时编译器自动调用的方法。
编译器默认会自动生成一个空方法体、无参数的构造器方法。
标识符相同,且在同一作用域,就说它们被重载。构造器本质上还是方法,和所有方法一样可以重载。
class Summer
{
private float tempreture;
public Summner()
{
tempreture = 35.5f;
}
public Summer(int tempreture)
{
this.tempreture = tempreture;
}
}
6.私有字段访问问题
Drink cola = new Drink(3.0);
Drink fanda = new Drink(3.0);
float diff = fanda.priceDifference(cola);
float colaPrice = cola.price;// 对面本身都无法访问私有字段 price
class Drink
{
private float price;
public Drink()
{
price = 0.0f;
}
public Drink(float price)
{
this.price = price;
}
public float priceDifference(Drink other)
{
float diff = price - other.price; // 问题:字段price是私有的,连对象自己都不能访问price,这里为什么可以访问 ??
}
}
7.解构器
构造器创建并初始化对象。解构器则检查对象并提取它的字段的值。
class Location
{
private x, y;
......
public void Deconstruct(out int x, out int y) // 解构器:
{ // a: 必须命名为 Deconstruct
x = this.x; // b: 必须是 void方法
y = this.y // c: 必须是获取一个或多个参数。参数用 out修饰符加以标记。如果向其赋值,这些值将传回给调用者。
}
}
...
Location location = new Location();
(int x, int y) = location; // C#在幕后运行解构器,向其传递元组中定义的变量。
8.共享字段
静态字段能在类的所有对象之间共享(非静态字段则局部于类的实例)。
const关键字声明的字段称为常量字段,是一种特殊的静态字段,值永远不变。只有数值类型(如int或double)、字符串类型和枚举类型的字段才能声明为const字段。
9.匿名类
匿名类是没有名字的类。虽然听起来很奇怪,但这种类有时相当好用。
var fish = new {Color="red", Weight=9}; // var关键字,对变量初始化的表达式是什么类型,编译器就用这个类型创建变量。
var anotherFish = new {Color="red", Weight=10};
C#编译器根据字段名称、类型、数量和顺序判断匿名类的两个实例是否具有相同的类型。
字段不仅名称和类型相同,顺序也相同,所以两个变量被认为是同一匿名类的实例。
anotherFish = fish; //同一匿名类的实例可以赋值
匿名类有时虽然好用,但存在相当多的限制。匿名类只能包含公共字段,字段必须全部初始化,不可以是静态,而且不能定义任何方法。

浙公网安备 33010602011771号