C#语法基础17_面向对象编程_封装性
C#语法基础17_面向对象编程_封装性
包含数据和方法的类将一系列代码进行封装。因此对于一个类,完成编写后或调用时,我们不再需要了解他的实现过程,只需要了解如何使用它。
因此如何编写类和使用类是极为重要的。
类的实例化
释1:以骰子为例,有一个骰子类,但我们真正要在现实中去投掷骰子时,我们需要确定这个骰子的具体信息,而不能再是一个抽象的骰子,给骰子类赋予确切的信息,例如默认值为1的6面骰子,这样的过程叫做类的实例化。
释2:类也可以理解为是一种自定义的特殊的数据类型(type),在定义好数据类型的基本内容后,我们需要创建和使用这种数据类型时,我们定义一个这种抽象的数据类型的一个个例,也就是将抽象的类进行实例化。可以理解int作为一个类,我们定义int num = 1;是int类的实例化
类经过实例化,出现这个类的实例,这个过程可以称作“创建对象”。
被实例化出的实例也可称作”对象“。
实例化语法
Classname objectname = new Classname();
Classname objectname = new Classname(para); // 根据构造方法,是否需要参数(构造方法常有多种重载,此时创建对象时可根据需要不填或填写多个参数)
类的结构(必要要素)
类的结构(必要要素) | 说明 |
---|---|
成员变量 | 类中必要的数据,常用private修饰表明仅在类中可见 |
构造方法 | 在创建类的实例(对象)时被调用,常用来初始化对象。 |
赋值方法和构造方法(或者使用访问器) | 通过对象调用对实例中的成员变量进行赋值和访问,当变量只有访问方法,无赋值方法时,变量为只读(read-only),同理...。 |
成员方法 | 通过对象调用,常是类的功能的方法(行为操作) |
ToString方法 | 可重写(override)返回值,修改类自动类型转化的返回值 |
一个骰子类的例子
// 骰子类
using System;
using System.Collections.Generic;
using System.Text;
namespace Test06 {
class Die {
private const int SIX_SIDED = 6;
private const int DEFAULT_FACEVALUE = 1;
private const int MIN_SIDES = 4;
private static Random randomNumber = new Random();
private int numFaces; // number of sides on die
private int faceValue;
public Die() { // Die类的构造方法
numFaces = SIX_SIDED;
faceValue = DEFAULT_FACEVALUE;
}
public Die(int faces) { // Die类的构造方法的一个重载
if(faces >= 4) {
numFaces = faces;
}
faceValue = DEFAULT_FACEVALUE;
}
public Die(int faces, int FaceValue) { // Die类的构造方法的一个重载
numFaces = faces;
this.faceValue = FaceValue;
}
public void RollDie() { // faceValue的赋值方法
faceValue = randomNumber.Next(1, numFaces + 1);
}
public int GetFaceValue() { // FaceValue的访问方法
return faceValue;
}
public override string ToString() {
return string.Format("numface is {0}, faceValue is {1}", numFaces,faceValue);
}
}
}
using System;
namespace Test06 {
class Program{
static void Main(string[] args) {
Die die1 = new Die();
Console.WriteLine(die1);
Die die2 = new Die(12);
Console.WriteLine(die2);
Die die3 = new Die(12,2);
Console.WriteLine(die3);
die3.RollDie();
Console.WriteLine(die3.GetFaceValue());
}
}
}
// 输出结果
// numface is 6, faceValue is 1
// numface is 12, faceValue is 1
// numface is 12, faceValue is 2
// 9
//
用访问器 代替 赋值方法和访问方法
优势:
代码更少,更紧凑
劣势:
编写时容易写错
// 骰子类(访问器版本)
using System;
using System.Collections.Generic;
using System.Text;
namespace Test06 {
class Die {
private const int SIX_SIDED = 6;
private const int DEFAULT_FACEVALUE = 1;
private const int MIN_SIDES = 4;
private static Random randomNumber = new Random();
private int numFaces; // number of sides on die
private int faceValue;
public Die() { // Die类的构造方法
numFaces = SIX_SIDED;
faceValue = DEFAULT_FACEVALUE;
}
public Die(int faces) { // Die类的构造方法的一个重载
if(faces >= 4) {
numFaces = faces;
}
faceValue = DEFAULT_FACEVALUE;
}
public Die(int faces, int FaceValue) { // Die类的构造方法的一个重载
numFaces = faces;
this.faceValue = FaceValue;
}
/* // 赋值方法
public void RollDie() {
faceValue = randomNumber.Next(1, numFaces + 1);
}
// 访问方法
public int GetFaceValue() {
return faceValue;
}
*/
// 访问器
// 此处FaceValue为faceValue的首字母大写形式,拥有这样访问器的成员变量称为类的属性
public int FaceValue {
set {
faceValue = value;
}
get {
return faceValue; // 注:此处faceValue为小写首字母
}
}
public override string ToString() { // ToString方法的重写
return string.Format("numface is {0}, faceValue is {1}", numFaces,faceValue);
}
}
}
using System;
namespace Test06 {
class Program{
static void Main(string[] args) {
Die die1 = new Die();
Console.WriteLine(die1);
Die die2 = new Die(12);
Console.WriteLine(die2);
Die die3 = new Die(12,2);
Console.WriteLine(die3);
die3.FaceValue = 3; // 此处调用时,成员变量的首字母需要大写为FaceValue,这样的成员变量成为类中的属性
Console.WriteLine(die3.FaceValue);
}
}
}
// 输出结果
// numface is 6, faceValue is 1
// numface is 12, faceValue is 1
// numface is 12, faceValue is 2
// 3
moyutime:本文仅是学习心得,观点仅供参考,祝愿读者学习途中快乐且不断有所收获。