计算机系统应用教程网站

网站首页 > 技术文章 正文

一篇文章搞懂C#中的抽象

btikc 2025-01-16 18:08:58 技术文章 19 ℃ 0 评论

1.1.1. 什么是抽象?

抽象是指隐藏细节,突出核心功能,使程序员专注于对象的主要功能。具体来说,抽象是将复杂系统的某些特性和行为提取出来,简化系统的设计和使用。

我们还是以电视遥控器为例来说明,

(1) 内部细节:电路板、红外线发射器等。

(2) 核心功能:打开电视、调节音量、换频道等。

但你只需按下按钮,电视就会执行相应的操作,而不需要了解遥控器内部的工作原理。这就是抽象,隐藏复杂的内部细节,突出简单的使用功能。

1.1.2. 实现抽象的两种方法

(1) 抽象类:不能实例化,可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。

(2) 接口:定义一组方法和属性,没有实现,类可以实现多个接口。

1.1.3. 抽象类

抽象类使用 abstract 关键字定义。抽象类中可以包含抽象方法和具体方法。

abstract class Animal
{
    // 抽象方法(没有方法体)
    public abstract void MakeSound();

    // 具体方法
    public void Sleep()
    {
        Console.WriteLine("Sleeping...");
    }
}
?
class Dog : Animal
{
    // 实现抽象方法
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}
?
class Program
{
    static void Main()
    {
        Dog dog = new Dog();
        dog.MakeSound();  // 输出:Bark
        dog.Sleep();      // 输出:Sleeping...
    }
}

1.1.4. 抽象类的特点

特点

解释

不能实例化

不能创建抽象类的对象。

可以包含具体方法

抽象类可以包含具体方法(有实现的方法)。

可以包含抽象方法

抽象类可以包含抽象方法(没有实现的方法)。

需要被继承

必须由子类继承并实现其抽象方法。

1.1.5. 接口

接口使用 interface 关键字定义,接口中只包含方法和属性的声明,没有实现。

interface IAnimal
{
    void MakeSound();
}
?
class Cat : IAnimal
{
    // 实现接口方法
    public void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}
?
class Program
{
    static void Main()
    {
        IAnimal cat = new Cat();
        cat.MakeSound();  // 输出:Meow
    }
}

1.1.6. 接口的特点

特点

解释

不能实例化

不能创建接口的对象。

没有实现

接口中的方法和属性没有实现。

需要被实现

必须由类实现接口中的所有方法和属性。

多重继承

一个类可以实现多个接口。

1.1.7. 抽象类 vs 接口

特点

抽象类

接口

实现

可以包含具体实现

不能包含具体实现

多重继承

不能多重继承

可以实现多个接口

字段

可以包含字段

不能包含字段

访问修饰符

可以使用访问修饰符

默认是 public,不能使用访问修饰符

1.1.8. 什么时候使用抽象类和接口?

使用抽象类

(1) 当你需要为一组相关对象提供通用的基类,并包含一些共有的实现细节。

(2) 当你有一些方法需要在基类中实现,并且其他方法需要在派生类中实现。

使用接口:

(1) 当你需要为不相关的类提供一些通用行为。

(2) 当你需要实现多重继承时,因为C#不支持类的多重继承,但支持接口的多重实现。

1.1.9. 示例对比

1.1.9.1. 抽象类示例

abstract class Shape
{
    public abstract double GetArea();
}
?
class Circle : Shape
{
    private double radius;
?
    public Circle(double radius)
    {
        this.radius = radius;
    }
?
    public override double GetArea()
    {
        return Math.PI * radius * radius;
    }
}
?
class Program
{
    static void Main()
    {
        Shape circle = new Circle(5);
        Console.WriteLine(#34;Area of circle: {circle.GetArea()}");
    }
}

1.1.9.2. 接口示例

interface IDrawable
{
    void Draw();
}
?
class Square : IDrawable
{
    public void Draw()
    {
        Console.WriteLine("Drawing a square");
    }
}
?
class Program
{
    static void Main()
    {
        IDrawable square = new Square();
        square.Draw();
    }
}

1.1.10. 总结

抽象通过隐藏对象的复杂性,只显示必要的功能,使程序员专注于对象的主要功能,忽略内部实现细节。C#通过抽象类和接口实现抽象,允许开发者创建灵活、易维护的代码。理解抽象类和接口的使用场景,是掌握C#面向对象编程的重要一步。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表