类的定义

在 C# 中,类是一种用户定义的数据类型,它是面向对象编程的基本构建块。类用于封装数据(通过字段)和行为(通过方法)。定义一个类的基本语法如下:

1
2
3
4
class ClassName
{
// 类的成员(字段、方法、属性等)
}

例如,定义一个简单的Person类:

1
2
3
4
5
6
7
8
9
10
class Person
{
// 字段,用于存储人的姓名
public string Name;
// 方法,用于打印问候语
public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name}.");
}
}

类的成员

字段

字段是类中的变量,用于存储数据。它们可以有不同的访问修饰符,如public、private、protected等。public字段可以从类的外部访问,而private字段只能在类的内部访问。例如,在上面的Person类中,Name是一个public字段。

方法

方法是类中的函数,用于定义类的行为。方法可以接受参数并返回一个值。例如,Person类中的SayHello方法没有参数,并且返回类型为void(即不返回任何值)。如果一个方法要返回一个值,需要在方法声明中指定返回类型。

例如:

1
2
3
4
5
6
7
class Calculator
{
public int Add(int num1, int num2)
{
return num1 + num2;
}
}

属性
属性提供了一种灵活的方式来访问和修改类中的数据。属性在形式上类似于字段,但实际上它们包含了get(用于获取值)和set(用于设置值)访问器。例如,我们可以为Person类的Name字段添加属性:

1
2
3
4
5
6
7
8
9
10
class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}

}

这样,我们可以通过属性来访问和修改_name字段,并且可以在get和set访问器中添加额外的逻辑,如数据验证。

构造函数

构造函数是一种特殊的方法,用于在创建类的对象时初始化对象的状态。构造函数的名称与类名相同,并且没有返回类型(甚至不能是void)。例如:

1
2
3
4
5
6
7
8
9
10
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}

现在,当我们创建一个Person对象时,必须提供姓名和年龄:

1
Person p = new Person("John", 30);

访问修饰符

public:公开的,类的外部可以访问。例如,public方法和字段可以在其他类中通过对象实例来访问。
private:私有的,只能在类的内部访问。通常用于封装类的内部实现细节,防止外部代码的非法访问。
protected:受保护的,只能在类的内部以及该类的派生类中访问。用于在继承关系中控制成员的访问权限。
internal:内部的,在同一个程序集(Assembly)内可以访问。这对于组织代码和限制访问范围很有用。

继承

C# 支持类的继承,它允许一个类(派生类或子类)继承另一个类(基类或父类)的成员。继承的语法如下:

1
2
3
4
class DerivedClass : BaseClass
{
// 派生类的成员
}

例如,定义一个Student类继承自Person类:

1
2
3
4
5
6
7
8
class Student : Person
{
public string School;
public Student(string name, int age, string school) : base(name, age)
{
School = school;
}
}

在这里,Student类继承了Person类的Name和Age字段以及相关方法。并且Student类有自己的字段School。构造函数中的base(name, age)用于调用基类Person的构造函数来初始化继承的成员。

多态性

多态性是面向对象编程的重要概念,C# 通过方法重写(Override)来实现多态。在基类中定义一个虚方法(使用virtual关键字),然后在派生类中重写该方法(使用override关键字)。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Shape
{
public virtual double Area()
{
return 0;
}
}
class Circle : Shape
{
private double radius;
public Circle(double r)
{
radius = r;
}
public override double Area()
{
return Math.PI * radius * radius;
}
}

当我们有一个Shape类型的数组,其中包含不同的形状(如Circle)对象时,通过调用Area方法,会根据对象的实际类型(多态)来执行正确的Area计算方法。



车辆类与向量类的定义和使用

车辆类(Vehicle Class)

定义和基本属性

首先,车辆类可以包含车辆的基本属性,如品牌(brand)、型号(model)、颜色(color)、速度(speed)等。在 C# 中,可以这样定义车辆类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Vehicle
{
public string Brand { get; set; }
public string Model { get; set; }
public string Color { get; set; }
private double speed;
public double Speed
{
get { return speed; }
set
{
if (value >= 0)
{
speed = value;
}
}
}
}

这里,Brand、Model和Color是公共属性,可以直接读写。Speed属性是通过一个私有字段speed来实现的,并且在设置速度时进行了简单的验证,确保速度不小于 0。

方法

车辆类可以有一些方法,比如加速(Accelerate)和减速(Decelerate)方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Vehicle
{
//... 前面定义的属性
public void Accelerate(double increment)
{
Speed += increment;
}
public void Decelerate(double decrement)
{
Speed -= decrement;
if (Speed < 0)
{
Speed = 0;
}
}
}

这些方法可以改变车辆的速度属性。Accelerate方法将速度增加指定的增量,Decelerate方法将速度减少指定的减量,并确保速度不会小于 0。


向量类(Vector Class)

定义和基本操作

在数学和编程中,向量是一个很重要的概念。在 C# 中,可以定义一个二维向量类,包含 x 和 y 两个分量。

1
2
3
4
5
6
7
8
9
10
class Vector
{
public double X { get; set; }
public double Y { get; set; }
public Vector(double x, double y)
{
X = x;
Y = y;
}
}

这是一个简单的向量类定义,有两个公共属性X和Y来表示向量的两个分量,并且通过构造函数来初始化这两个分量。

向量运算方法

向量类可以有一些方法来进行向量运算,比如向量加法和减法。

1
2
3
4
5
6
7
8
9
10
11
12
class Vector
{
//... 前面定义的属性和构造函数
public Vector Add(Vector other)
{
return new Vector(X + other.X, Y + other.Y);
}
public Vector Subtract(Vector other)
{
return new Vector(X - other.X, Y - other.Y);
}
}

Add方法用于将当前向量和另一个向量相加,返回一个新的向量。Subtract方法用于将当前向量减去另一个向量,也返回一个新的向量。