No title
No title
John Doe接口和抽象类
1. 定义和用途
- 接口(Interface):
- 定义:接口是一个只能包含方法签名、属性、事件和索引器的类型声明。接口不能包含字段(除非是静态字段),也不能有实现。
- 用途:接口用于定义类的公共合同。实现了某个接口的类必须提供该接口中定义的所有方法的实现。
- 抽象类(Abstract Class):
- 定义:抽象类是一个不能被实例化的类,可以包含方法实现、字段、属性、构造函数等。它可以包含完全实现的方法(非抽象方法)以及抽象方法(没有实现的方法)。
- 用途:抽象类用于提供一个基本的实现和共享的功能,这些功能可以被派生类继承和重用。抽象类用于建立一个共同的基类,为多个派生类提供基础功能。
2. 继承和实现
接口:
实现:一个类可以实现多个接口(多重继承)。接口的实现是通过
:
符号进行的,例如:class MyClass : IMyInterface { ... }
。有两种方式:1,隐式实现,2显示实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// 定义接口
public interface IExample
{
void Display();
}
// 类实现接口的隐式实现
public class ExampleClass : IExample
{
// 隐式实现接口方法
public void Display()
{
Console.WriteLine("This is an implicit implementation of Display.");
}
}
public class ExampleClass : IExample
{
// 显式实现 IExample 接口的方法
void IExample.Display()
{
Console.WriteLine("This is an explicit implementation of IExample.Display.");
}
}继承:接口之间可以继承自其他接口,但接口不能继承自类,先继承,再实现。
抽象类:
- 继承:一个类只能继承一个抽象类(单继承)。抽象类的继承是通过
:
符号进行的,例如:class MyClass : MyBaseClass { ... }
。 - 实现:抽象类可以实现接口,并且可以通过实现这些接口来定义其公共合同。
- 继承:一个类只能继承一个抽象类(单继承)。抽象类的继承是通过
3. 成员
接口:
只能包含方法签名、属性、事件、索引器的声明。接口成员默认是
public
,不允许添加访问修饰符。不能包含字段(静态字段和常量除外),也不能包含构造函数或析构函数。
语法特征
1
2
3
4[public] interface I...able
{
方法;
}
抽象类:
- 可以包含字段、构造函数、析构函数、方法(包括抽象方法和非抽象方法)、属性、事件等。
- 抽象类的成员可以有不同的访问修饰符(
public
、protected
、private
)。
4. 构造函数和析构函数
接口: 不支持构造函数或析构函数。
抽象类: 可以有构造函数和析构函数。抽象类可以在其构造函数中初始化字段等。
调用抽象类里面的非抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40using System;
// 定义抽象类
public abstract class Animal
{
// 非抽象方法(具有实现)
public void Eat()
{
Console.WriteLine("Eating...");
}
// 抽象方法(没有实现)
public abstract void MakeSound();
}
// 从抽象类派生的具体子类
public class Dog : Animal
{
// 实现抽象方法
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
public class Program
{
public static void Main()
{
// 创建子类的实例
Dog myDog = new Dog();
// 调用抽象类中的非抽象方法
myDog.Eat(); // 输出 "Eating..."
// 调用实现的抽象方法
myDog.MakeSound(); // 输出 "Woof!"
}
}