接口,抽象类,泛型
掌握抽象类与接口的定义、区别
掌握泛型类与泛型方法
能根据场景选择合适的抽象方式
核心讲解
(1)抽象类 abstract
不能实例化,只能当父类
可以有抽象方法(只有声明,没有实现)
也可以有普通方法、字段、属性
单继承
适合:有共同实现的相关类,模板模式
(2)接口 interface
纯行为规范,只有声明,没有实现
不能有字段,方法默认 public abstract
一个类可以实现多个接口,弥补单继承不足
适合:定义能力、契约,多态
命名约定:I 开头,比如
IFlyable
(3)泛型
参数化类型,一份代码支持多种类型,类型安全,复用性高。
泛型类:
class 类名<T>泛型方法:
返回值 方法名<T>(参数)可以有多个泛型参数
泛型约束:
where T : 约束,限制类型
操作步骤
定义接口和抽象类,编写实现类
定义泛型工具类
运行验证
代码示例
// 抽象类
public abstract class Shape
{
public string Name { get; set; }
public abstract double GetArea(); // 抽象方法
public void PrintName()
{
Console.WriteLine("图形:" + Name);
}
}
// 接口
public interface IDrawable
{
void Draw();
}
// 实现类:圆形,继承抽象类,实现接口
public class Circle : Shape, IDrawable
{
public double Radius { get; set; }
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
public void Draw()
{
Console.WriteLine("绘制圆形,半径" + Radius);
}
}
// ===== 泛型工具类 =====
public class Box<T>
{
public T Data { get; set; }
public void Print()
{
Console.WriteLine("盒子里的数据:" + Data);
}
}
// 泛型方法
T Max<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? a : b;
}
// Program.cs
// 多态
Shape shape = new Circle { Name = "圆形", Radius = 5 };
shape.PrintName();
Console.WriteLine("面积:" + shape.GetArea());
IDrawable drawable = new Circle();
drawable.Draw();
// 泛型
Box<int> intBox = new Box<int> { Data = 123 };
intBox.Print();
Box<string> strBox = new Box<string> { Data = "hello" };
strBox.Print();
Console.WriteLine("\n较大值:" + Max(10, 20));
Console.WriteLine("较大字符串:" + Max("abc", "xyz"));
Console.ReadKey();
常见误区
接口方法加 public:接口方法默认 public,不用加,实现的时候必须加 public
抽象方法不 override:子类实现抽象方法必须加 override
泛型用 object 代替:泛型是类型安全的,用 object 失去泛型意义了
接口和抽象类分不清:有共同实现用抽象类,只定义行为用接口;类只能继承一个,接口可以实现多个
课后练习
定义一个
IRunnable接口,有 Run 方法定义
Car和Person类,都实现 IRunnable写一个泛型方法,交换两个变量的值
对比抽象类和接口的区别,分别说明适用场景

