C# abstract virtual interface

本文详细解析了 C# 中抽象类与接口的基本概念及使用方式,包括抽象类的特点、接口的特性以及 virtual 关键字的作用,并通过具体示例展示了如何正确地运用这些特性。

1,abstract

微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract

abstract 修饰符可用于类、方法、属性、索引和事件(事件好像不行)。
抽象类不能实例化。
只有抽象类中才允许抽象方法声明。
在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
无法使用 sealed 修饰符来修改抽象类,因为两个修饰符具有相反的含义。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。
抽象类可以继承接口,但必须实现接口方法(显示实现,隐式实现,抽象实现)。

interface IAction
{
    void Fly();
    void Swim();
}

public abstract class Bird : IAction
{
    private int birdAge;
    protected int birdType;
   
    protected abstract int BirdAge//受保护重写,不能改变修饰符
    {  set; get;  }
    protected abstract void Nest();//受保护重写,不能改变修饰符

    public abstract void Eat();//公有重写,不能改变修饰符
    public abstract void Swim();//抽象实现接口函数

    public void Say()
    {
        Debug.Log("Bird Say ");
    }
    public void SetBirdAge(int birdAge)
    {
        this.birdAge = birdAge;
    }
    public void Fly()//隐式实现接口函数,接口与类都可以调用
    {
        Debug.Log("Bird Fly ");
    }
    void IAction.Fly()//默认为public,显示实现接口函数,接口可以调用,类不能调用
    {
        Debug.Log("IAction Fly ");
    }
    void IAction.Swim()//默认为public,显示实现接口函数,接口可以调用,类不能调用
    {
        Debug.Log("IAction Swim ");
    }
}

public class Bird_YanZi : Bird
{
    protected override int BirdAge
    {
        get{ return birdType; }
        set{ birdType = value;}
    }
    protected override void Nest()
    {
        Debug.Log("Bird_YanZi Nest ");
    }
    public override void Eat()
    {
        Debug.Log("Bird_YanZi Eat ");
    }
    public override void Swim()
    {
        Debug.Log("Bird_YanZi Swim ");
    }
    public void DoSomething()
    {
        SetBirdAge(10);
    }
}

2,interface

微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interface

接口只包含方法、属性、索引器,事件(事件好像不可以)的签名。默认都为public,且不能使用限制访问修饰符。
一个接口可从一个或多个基接口继承。

实现接口的类可以显式实现该接口的成员。 显式实现的成员不能通过类实例访问,而只能通过接口实例访问。
基类型列表包含基类和接口时,基类必须是列表中的第 1 项(不知道是什么意思?不管了)。

interface IAnimAction
{
    void Eat();
    int Age{get;set;}
    int this[int index] { get;set; }
}

interface IAnimSpecialAction : IAnimAction
{
    void SpecialEat();
}
public class Anim : IAnimSpecialAction,IAnimAction
{......}

3,virtual

微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual

virtual 关键字用于修改方法、属性、索引器或事件声明(事件好像不行),并使它们可以在派生类中被重写。
virtual 修饰符不能与 static,abstract,private 或 override 修饰符一起使用。
如果出现以下情况,Fruit是父类,Apple是子类。
比如:Fruit fruit(引用部分) = new Apple()对象部分;
一个引用部分,一个是对象部分,如果是virtual ,那就看对象部分的内容。否则就看引用部分的内容。

public class Fruit
{
    int age;
    int[] myType = new int[10];
    public virtual void Eat() { }
    public virtual int Age { get {return age; } set {age = value; } }
    public virtual int this[int index] {get { return myType[index]; } set { myType[index] = value; } }
}

 

 

 

 

 

 

 

### C# 中抽象类与接口的区别 #### 定义与基本特征 在C#中,抽象类和接口都是面向对象编程的重要组成部分。两者均支持继承机制,允许派生类或实现类扩展其功能。 - **抽象类**:作为基类存在,能够包含成员变量、已实现的方法以及未实现的抽象方法。抽象类本身不可实例化,但可定义部分通用逻辑供子类重用[^2]。 - **接口**:仅能声明方法签名而不提供具体实现;它代表了一组能力契约,规定哪些操作应该被执行而不是如何执行。多个接口可以在同一个类上共存,从而增加灵活性[^1]。 #### 实现方式差异 对于抽象类而言: - 可以拥有字段和其他非公共成员; - 支持虚方法(virtual),即提供了默认行为但仍允许覆写; - 子类只需覆盖标记为`abstract`的方法即可[^3]。 相比之下,接口的特点如下: - 不具备状态信息(无字段); - 所有成员自动视为`public abstract`,无需显式指定修饰符; - 类型可以同时遵循若干个不同接口的要求。 ```csharp // 抽象类示例 public abstract class Animal { public string Name { get; set; } // 已实现的方法 public void Eat() => Console.WriteLine($"{Name} is eating."); // 未实现的抽象方法 public abstract void MakeSound(); } // 接口示例 public interface IFlyable { void Fly(); // 默认为 public 和 abstract } ``` #### 应用场景对比 当考虑使用哪种形式时,应基于实际需求来决定: - 如果希望创建一组具有相似特性的实体,并且这些实体之间共享一些基础的行为模式,则适合采用抽象类的形式。这有助于构建层次化的类体系结构并促进代码复用。 - 当目标是在不改变现有类的情况下为其添加新的功能性时,或者需要表达某种角色而非特定类型的对象关系网时,应当优先选用接口。这样做的好处是可以让任意数量的不同种类的对象都能表现出一致的行为特性。 #### 设计考量因素 选择抽象类还是接口取决于项目的设计哲学和技术约束条件: - 对于框架开发者来说,通过定义一系列抽象类及其内部的抽象成员,可以有效地指导第三方库作者按照既定规则编写兼容组件。 - 开发者如果想要确保某个类至少实现了某些必要的功能点而又不想限定其实现细节的话,那么利用接口将会是一个明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值