当前位置: 首页 > article >正文

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)


http://www.kler.cn/a/461261.html

相关文章:

  • const修饰指针
  • AI数据标注师理论部分考试题库 - 500题
  • Python 链接 Pcomm
  • C# 服务调用RFC函数获取物料信息,并输出生成Excel文件
  • Spring源码分析之事件机制——观察者模式(二)
  • 【数据结构Ⅰ复习题】
  • 2025.01.15python商业数据分析
  • 从AI远见到中国速度:Scaling Law发现者为何引全球热议?
  • windows系统安装完Anaconda之后怎么激活自己的虚拟环境并打开jupyter
  • 区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】
  • 鸿蒙开发:自定义一个车牌字母键盘
  • 混合并行训练框架性能对比
  • 未来20年在大语言模型相关研究方向--大语言模型的优化与改进
  • C语言优化技巧--达夫设备(Duff‘s Device)解析
  • 鸿蒙服务卡片
  • 反射工具类ReflectUtil
  • 最近的一些事情
  • 基础算法--滑动窗口
  • 深入理解MVCC:快照读与当前读的原理及实践
  • LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作
  • Docker容器日志查看与清理的方法
  • es使用简单语法案例
  • 使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包
  • SpringBoot 消息推送之 WebSocket和SseEmitter
  • 如何规范的提交Git?
  • 管理系统中经典审核功能实现