c#接口和抽象方法
目录
抽象方法
1,抽象方法的定义,
2,抽象方法的特性
3,实例
接口
1,接口的定义
2,实现接口
3,接口实例
4,接口的特点
5,多接口实现
接口和抽象类的比较
抽象方法
抽象方法是指在抽象类中声明的方法,他没有方法体,而是让派生类来提供具体的实现, 抽象方法通过abstrtact关键字来声明,抽象类方法的主要目的是强制派生类必须实现 该方法,抽象方法所在的类称为抽象类
1,抽象方法的定义,
它的声明形式如下:
public abstract 返回类型 MethodName(参数列表);
2,抽象方法的特性
(1)没有方法体
(2)必须被重写,抽象方法必须在派生类中实现(override关键字)
(3)只能在抽象类中声明,抽象方法只能出现在抽象类中,不能在普通类声明
3,实例
using System;
// 定义一个抽象类
public abstract class Animal
{
// 抽象方法,派生类必须实现
public abstract void MakeSound();
// 已实现的方法
public void Sleep()
{
Console.WriteLine("This animal is sleeping.");
}
}
// 派生类 Dog 必须实现 MakeSound 方法
public class Dog : Animal
{
// 重写抽象方法
public override void MakeSound()
{
Console.WriteLine("Woof! Woof!");
}
}
// 派生类 Cat 必须实现 MakeSound 方法
public class Cat : Animal
{
// 重写抽象方法
public override void MakeSound()
{
Console.WriteLine("Meow!");
}
}
class Program
{
static void Main()
{
// Animal 是抽象类,不能实例化
// Animal animal = new Animal(); // 错误!
// 创建 Dog 和 Cat 对象
Animal myDog = new Dog();
myDog.MakeSound(); // 输出:Woof! Woof!
myDog.Sleep(); // 输出:This animal is sleeping.
Animal myCat = new Cat();
myCat.MakeSound(); // 输出:Meow!
myCat.Sleep(); // 输出:This animal is sleeping.
}
}
接口
接口与抽象方法类似,也是只声明方法名,让派生类实现具体内容
1,接口的定义
接口通过interface关键字来定义,接口中可以声明方法,属性,事件等成员
例:
public interface IMyInterface
{
// 方法声明
void MyMethod();
// 属性声明
int MyProperty { get; set; }
// 事件声明
event EventHandler MyEvent;
}
2,实现接口
接口在被派生类继承后,派生类必须要提供接口中声明的所有方法和属性的实现
例:
public class MyClass : IMyInterface
{
// 实现接口方法
public void MyMethod()
{
Console.WriteLine("Method implemented.");
}
// 实现接口属性
public int MyProperty { get; set; }
// 实现接口事件
public event EventHandler MyEvent;
}
3,接口实例
using System;
// 定义一个接口
public interface IAnimal
{
// 接口中的方法
void MakeSound();
// 接口中的属性
string Name { get; set; }
// 接口中的事件
event EventHandler OnSoundMade;
}
// 实现接口的类
public class Dog : IAnimal
{
// 属性的实现
public string Name { get; set; }
// 方法的实现
public void MakeSound()
{
Console.WriteLine($"{Name} says Woof!");
OnSoundMade?.Invoke(this, EventArgs.Empty); // 触发事件
}
// 事件的实现
public event EventHandler OnSoundMade;
}
// 主程序
public class Program
{
public static void Main()
{
IAnimal myDog = new Dog { Name = "Buddy" };
// 订阅事件
myDog.OnSoundMade += (sender, e) =>
{
Console.WriteLine("A sound was made!");
};
// 调用方法
myDog.MakeSound();
}
}
输出:
Buddy says Woof!
A sound was made!
4,接口的特点
(1)没有实现
(2)多重实现,一个类可以继承多个接口
(3)接口不包含字段和构造函数
(4)支持事件,接口中可以声明事件
(5)接口中的成员只能用public修饰符,不能有其他访问修饰符
5,多接口实现
例:
public interface IWalkable
{
void Walk();
}
public interface ISwimmable
{
void Swim();
}
public class Animal : IWalkable, ISwimmable
{
public void Walk()
{
Console.WriteLine("Walking...");
}
public void Swim()
{
Console.WriteLine("Swimming...");
}
}
class Program
{
static void Main()
{
Animal animal = new Animal();
animal.Walk(); // 输出:Walking...
animal.Swim(); // 输出:Swimming...
}
}
接口和抽象类的比较
特性 | 接口 | 抽象类 |
成员定义 | 只能包含方法、属性、事件等的声明,不能包含字段 | 可以包含方法声明、字段、构造函数、属性等 |
多重继承 | 支持一个类实现多个接口 | 不支持多重继承,一个类只能继承一个抽象类 |
成员实现 | 成员只能由实现接口的类提供实现 | 可以提供部分实现(抽象方法不提供实现) |
访问修饰符 | 所有成员默认是 public | 可以指定访问修饰符(如 private, protected) |