1. 类的概念
在C#中,类是面向对象编程(OOP)的基本概念之一。简单来说,类是一个蓝图或模板,它定义了一种对象的行为和属性。类是一种数据结构,包括数据(字段)和函数(方法),可用于创建对象。
面向对象编程(OOP)是一种编程范式,其中程序由对象组成,每个对象都包含数据和执行操作的功能。OOP的核心是类和对象,许多编程语言中都支持OOP,C#就是其中之一。
1.1 类的定义
在C#中定义类的语法如下:
[attributes]
[modifiers] class class_name[:base_class_name,
interface_name1,
interface_name2, ...]
{
[class_members]
}
其中各个关键字的含义如下:
attributes:可选的类属性,例如[Obsolete]
,[Serializable]
等。
modifiers:可选的访问修饰符,例如public
,private
,internal
等。
class_name:类的名称。
base_class_name:可选的父类的名称,用于实现继承。
interface_name1, interface_name2, ...:可选的接口名,用逗号隔开,用于实现接口。
class_members:类成员,例如字段、属性、方法等。
在一个类中,通常会定义以下类型的成员:
字段(Fields):类中用于存储数据的变量。
属性(Properties):类中对字段进行封装的方式,提供读写以及其他操作的方法。
方法(Methods):类中的函数,用于执行操作或计算。
事件(Events):在特定条件下发出信号的成员。
索引器(Indexers):类中的特殊成员,可以像数组一样使用来访问某个属性的元素。
构造函数(Constructors):用于创建对象的成员函数。
静态成员(Static members):与类本身相关联而不是特定对象的成员,例如静态属性、静态方法。
1.2 类的实例化
在定义了一个类之后,必须实例化该类才能使用它。在C#中,通过new
关键字来创建类的实例。下面是一个简单的示例:
class Person
{
public string Name;
public int Age;
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "张三";
p1.Age = 20;
Console.WriteLine("姓名:{0},年龄:{1}", p1.Name, p1.Age);
Console.ReadKey();
}
}
上面的代码定义了一个名为Person
的类,类中包含两个字段Name
和Age
。在线性代码中,通过new
关键字创建了Person
类的实例p1
,然后分别给Name
和Age
赋值,并通过Console.WriteLine()
方法将结果输出到控制台。
1.3 类的继承
在C#中,可以通过继承实现代码的重用,并且可以在不修改基类的情况下扩展类的功能。在继承中,子类(派生类)继承了父类(基类)的属性和方法。
使用:
符号连接基类和派生类即可实现继承。下面是一个简单的示例:
class Animal
{
// 基类的构造函数
public Animal(string name)
{
Console.WriteLine("各种动物都有的属性");
Name = name;
}
public string Name { get; set; }
}
class Dog : Animal
{
// 派生类的构造函数
public Dog(string name) : base(name)
{
Console.WriteLine("狗的属性");
}
public void Bark()
{
Console.WriteLine("汪汪!");
}
}
class Program
{
static void Main(string[] args)
{
Dog myDog = new Dog("小黑");
myDog.Bark();
Console.ReadKey();
}
}
上面的代码定义了一个Animal
类作为基类,然后在Dog
中继承了基类。在Dog
类的构造函数中,使用base()
方法调用基类的构造函数并传递参数。在main()
函数中,创建了一个Dog
类的实例并调用了Bark()
方法。需要注意的是,Dog
类继承了Animal
类的Name
属性。
1.4 类的多态
在面向对象编程中,多态是指同一类型的对象在不同的情况下可以具有不同的表现形式。在C#中,多态可以通过重写或重载来实现。
方法重写(Method overriding):在父类中定义了一个虚方法,子类可在自己的类中重写这个虚方法来实现多态。下面是一个示例:
class Animal
{
public virtual void Speak()
{
Console.WriteLine("所有动物都可以发出声音");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("汪汪!");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("喵喵!");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal();
myAnimal.Speak();
Dog myDog = new Dog();
myDog.Speak();
Cat myCat = new Cat();
myCat.Speak();
Console.ReadKey();
}
}
上面的代码定义了一个Animal
类作为基类,其中定义了一个虚方法Speak()
。然后在Dog
和Cat
类中覆盖了基类的方法,实现了多态。在main()
函数中,分别创建了一个Animal
类、Dog
类和Cat
类的实例,并调用它们的Speak()
方法。
方法重载(Method overloading):在一个类中可以定义多个同名的方法,只要它们的参数类型或个数不同即可实现多态。下面是一个示例:
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
Calculator myCalc = new Calculator();
int iResult = myCalc.Add(1, 2);
Console.WriteLine("整数相加结果:{0}", iResult);
double dResult = myCalc.Add(1.5, 2.5);
Console.WriteLine("浮点数相加结果:{0}", dResult);
Console.ReadKey();
}
}
上面的代码定义了一个Calculator
类,在其中定义了两个同名的方法Add()
,只是参数类型不同。在main()
函数中,创建了一个Calculator
类的实例,并调用了两次不同类型的Add()
方法,实现了多态。