C# 接口 Interface 基础入门与实现详解
了解 C# 中接口(Interface)的定义、特点及其与抽象类的区别,通过完整代码示例学习如何实现单接口、多接口继承及安全的类型转换方法。
接口与抽象类的核心区别
接口是 C# 面向对象编程中的重要概念,主要用于定义行为规范。它与抽象类有显著差异:首先,抽象类可以包含具体方法和抽象方法,且必须至少有一个抽象方法;而接口在传统定义中不包含方法的具体实现。其次,抽象类支持构造函数和析构函数,接口则不支持。最后,一个类只能继承一个抽象类,但可以实现多个接口。
接口中的成员默认具有 public 访问修饰符,因此无需显式声明。此外,不能直接创建接口的实例,例如 IPerson xx = new IPerson(); 会导致编译错误。
<summary>
/// interface
/// 与抽象类的区别:
/// 1. abstract可以有具体方法和抽象方法(必须有一个抽象方法),interface没有方法实现
/// 2. abstract可以有构造函数和析构函数,接口不行
/// 3. 一个类可以实现多个interface,但只能继承一个abstract
/// 特点:
/// - interface成员隐式具有public,所以不加修饰符
/// - 不可以直接创建接口的实例
</summary>
public interface IPerson
{
string Name { get; set; } // 属性
DateTime Brith { get; set; }
int Age(); // 方法
}
interface IAdderss
{
uint Zip { get; set; }
string State();
}
实现多个接口与接口继承
在实际开发中,类经常需要实现多个接口以满足不同的行为需求。实现时,必须为接口定义的所有成员提供完整的实现逻辑。
此外,接口本身也可以继承其他接口。例如,IManager 接口继承了 IPerson 接口,这意味着实现 IManager 的类同时也隐含了 IPerson 的要求。
<summary>
/// interface实现interface
/// </summary>
interface IManager : IPerson
{
string Dept { get; set; }
}
<summary>
/// 实现多个interface
/// 实现哪个interface必须写全实现的所有成员!
/// </summary>
public class Employee : IPerson, IAdderss
{
public string Name { get; set; }
public DateTime Brith { get; set; }
public int Age()
{
return 10;
}
public uint Zip { get; set; }
public string State()
{
return "alive";
}
}
重写接口方法与继承
当基类实现了接口,并且其接口成员方法标记为 virtual 时,派生类可以使用 override 关键字重写该方法。这允许在保持接口契约的同时,提供特定的行为扩展。
// 重写接口实现
// 类 Employer 实现了IPerson,其中方法Age()标记为virtual,所以继承于Employer的类可以重写Age()
public class Employer : IPerson
{
public string Name { get; set; }
public DateTime Brith { get; set; }
public virtual int Age()
{
return 10;
}
}
public class Work : Employer
{
public override int Age()
{
return base.Age() + 100; // base指向父类
}
}
对象实例化与接口强制转换
虽然不能直接实例化接口,但可以通过实例化实现了接口的类来创建对象,并获取接口类型的引用。在进行接口转换时,推荐使用 as 运算符而非直接强转,以确保安全性。
第1步:创建类实例
首先创建一个具体的类实例,如 Employee,并在初始化块中设置属性值。
第2步:使用 as 进行安全转换
is 关键字用于检查类型兼容性,但不执行转换。as 关键字尝试将对象转换为指定类型,如果失败则返回 null,避免了强转可能引发的异常。建议在使用 as 后进行非空判断。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









