### C# 抽象接口委托反射等技术详解 #### 一、抽象类与抽象方法 **1.1 版权声明** 本文档源自于http://www.cnblogs.com/wuhui369161243/archive/2009/03/29/1424677.html,原作者为Me丶紫龙。 **1.2 内容详情** 抽象类在C#中是一个特殊类型的类,它不能被实例化,只能作为其他类的基类。抽象类中可以包含抽象方法,也可以不包含抽象方法,但这取决于抽象类的设计目的。通常情况下,抽象类是用来提供一种通用行为的基础,而具体实现则留给子类去完成。接下来详细介绍抽象类的相关特性和抽象方法的使用。 - **抽象类的特性** - **不可实例化**: 抽象类不能直接创建实例对象,只能通过继承的方式使用其子类来创建对象。 - **包含抽象成员**: 抽象类可以包含抽象方法、属性、索引器和事件,也可以包含具体的实现方法。 - **不能被sealed**: 抽象类不能被声明为sealed,意味着该类不能被继承。 - **子类需实现抽象成员**: 从抽象类派生的非抽象类必须实现所有的抽象成员。 - **抽象方法的特性** - **隐式虚拟性**: 抽象方法默认是virtual的,可以在派生类中重写。 - **无实现**: 抽象方法没有具体的实现,只提供方法签名。 - **仅限于抽象类**: 抽象方法只能出现在抽象类中。 - **重写要求**: 在派生类中必须使用override关键字重写抽象方法。 - **不能有static或virtual修饰符**: 抽象方法不允许使用static或virtual修饰符。 **示例代码** ```csharp public abstract class Animal { public abstract void MakeSound(); // 抽象方法 public virtual void Eat() { Console.WriteLine("Animal is eating."); } } public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof!"); } public override void Eat() { Console.WriteLine("Dog is eating."); } } public class Program { public static void Main(string[] args) { Dog dog = new Dog(); dog.MakeSound(); // 输出 "Woof!" dog.Eat(); // 输出 "Dog is eating." } } ``` 在这个例子中,`Animal` 是一个抽象类,包含了抽象方法 `MakeSound()` 和具体的 `Eat()` 方法。`Dog` 类继承自 `Animal` 并实现了抽象方法 `MakeSound()`,同时也重写了 `Eat()` 方法。 #### 二、接口基础教程 **2.1 内容详情** 接口在C#中是一种特殊的类型,它定义了一组方法、属性、索引器和事件,但不包含任何实现。接口的主要作用在于定义对象间通信的标准,即定义了对象应具有的行为而不是具体如何实现这些行为。 - **接口概述** - **成员**: 接口可以包含方法、属性、索引器和事件。 - **实现**: 实现接口的类必须提供接口中定义的所有成员的具体实现。 - **多重继承**: 接口支持多重继承,一个类可以实现多个接口。 - **定义接口** - 使用 `interface` 关键字定义接口。 - 接口中定义的成员默认为公共(public)且抽象(implicit abstract)。 **示例代码** ```csharp public interface IShape { double GetArea(); } public class Circle : IShape { public double Radius { get; set; } public Circle(double radius) { Radius = radius; } public double GetArea() { return Math.PI * Radius * Radius; } } public class Rectangle : IShape { public double Width { get; set; } public double Height { get; set; } public Rectangle(double width, double height) { Width = width; Height = height; } public double GetArea() { return Width * Height; } } public class Program { public static void Main(string[] args) { IShape circle = new Circle(5); Console.WriteLine("Circle Area: " + circle.GetArea()); // 输出 "Circle Area: 78.53981633974483" IShape rectangle = new Rectangle(4, 6); Console.WriteLine("Rectangle Area: " + rectangle.GetArea()); // 输出 "Rectangle Area: 24" } } ``` 在这个例子中,`IShape` 是一个接口,定义了一个名为 `GetArea()` 的方法。`Circle` 和 `Rectangle` 类实现了 `IShape` 接口,并提供了 `GetArea()` 方法的具体实现。 #### 三、抽象类与接口的区别 抽象类与接口之间有一些重要的区别: - **成员**: 抽象类可以拥有字段、属性、构造函数、方法、索引器和事件,而接口只包含抽象方法、属性、索引器和事件。 - **实现**: 抽象类中的成员可以部分实现,接口中的成员则必须全部实现。 - **继承**: 类只能继承一个抽象类,但可以实现多个接口。 - **构造函数**: 抽象类可以有构造函数,接口不能有构造函数。 - **访问修饰符**: 抽象类中的成员可以有不同的访问级别,而接口中的成员默认为公共(public)且不可更改。 **示例代码** ```csharp public abstract class Base { protected int _value; public abstract void DoSomething(); public void CommonMethod() { Console.WriteLine("Base class common method."); } } public interface IInterface { void DoSomething(); } public class Derived : Base, IInterface { public override void DoSomething() { Console.WriteLine("Derived class implementation."); } } public class Program { public static void Main(string[] args) { Derived derived = new Derived(); derived.DoSomething(); // 输出 "Derived class implementation." derived.CommonMethod(); // 输出 "Base class common method." } } ``` 在这个例子中,`Base` 是一个抽象类,包含一个抽象方法 `DoSomething()` 和一个具体的方法 `CommonMethod()`。`IInterface` 是一个接口,定义了一个名为 `DoSomething()` 的方法。`Derived` 类既继承了 `Base` 抽象类又实现了 `IInterface` 接口。 #### 四、把委托说透 **4.1 内容详情** 委托在C#中是一种引用类型,它允许将方法当作参数传递给其他方法。委托可以用于异步处理、事件机制等场景。 - **委托的基本概念** - **定义**: 使用 `delegate` 关键字定义委托类型。 - **实例化**: 创建委托实例,并关联到具体的方法。 - **调用**: 通过委托实例调用方法。 - **示例代码** ```csharp public delegate void MyDelegate(int num); public class DelegateExample { public static void Method1(int num) { Console.WriteLine("Method1: " + num); } public static void Method2(int num) { Console.WriteLine("Method2: " + num); } public static void Main(string[] args) { MyDelegate del = new MyDelegate(Method1); del += Method2; del(10); // 输出 "Method1: 10" 和 "Method2: 10" } } ``` 在这个例子中,定义了一个名为 `MyDelegate` 的委托类型,它接受一个整型参数并返回 void。`Method1` 和 `Method2` 都是符合 `MyDelegate` 委托类型的签名。通过 `+=` 操作符,将两个方法都关联到了同一个委托实例 `del` 上,并可以通过 `del` 调用这些方法。 #### 五、反射 **5.1 内容详情** 反射是.NET Framework中的一个重要特性,它允许程序在运行时获取类型的信息以及调用类型的方法或属性。反射常用于框架开发、动态创建对象、动态加载类型等场景。 - **反射的基本操作** - **获取类型信息**: 使用 `Type` 类的 `GetType()` 或 `Assembly` 类的 `GetType()` 方法。 - **获取成员信息**: 获取类的属性、方法、字段等信息。 - **动态创建实例**: 使用 `Activator` 类的 `CreateInstance` 方法。 - **动态调用方法**: 使用 `InvokeMember` 方法。 - **示例代码** ```csharp using System; using System.Reflection; public class ReflectionExample { public static void Main(string[] args) { Type myType = typeof(ReflectionExample); MethodInfo[] methods = myType.GetMethods(BindingFlags.Public | BindingFlags.Static); foreach (MethodInfo method in methods) { Console.WriteLine(method.Name); } object instance = Activator.CreateInstance(myType); Console.WriteLine("Instance created: " + instance); } } ``` 在这个例子中,使用 `GetType()` 方法获取 `ReflectionExample` 类的类型信息,并使用 `GetMethods()` 方法获取该类的所有公共静态方法。接着使用 `Activator.CreateInstance` 方法动态创建 `ReflectionExample` 类的实例。 通过以上内容,我们可以了解到C#中的抽象类、接口、委托以及反射的基本概念、特性和使用方法。这些技术在实际编程中非常重要,掌握了它们能够帮助我们更好地设计和实现复杂的系统。
剩余108页未读,继续阅读
- sgfatboy2015-05-14作为参考还可以,不过分值偏高了。
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助