C# 抽象类和方法

抽象类无法实例化。 如果一个类至少包含一个抽象方法,则也必须将其声明为抽象方法。 抽象方法无法实现; 他们只是声明方法的签名。 当我们从抽象类继承时,所有抽象方法都必须由派生类实现。 此外,必须以较少受限制的可见性声明这些方法。

与接口不同,抽象类可能具有完全实现的方法,并且可能具有定义的成员字段。 因此,抽象类可以提供部分实现。 程序员经常将一些通用功能放入抽象类中。 这些抽象类随后会被子类化以提供更具体的实现。 例如,Qt 图形库具有QAbstractButton,它是按钮小部件的抽象基类,提供按钮所共有的功能。 按钮Q3ButtonQCheckBoxQPushButtonQRadioButtonQToolButton都从此基本抽象类继承。

正式地说,抽象类用于强制执行协议。 协议是所有实现对象都必须支持的一组操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Program.
using System;

namespace AbstractClass
{
    abstract class Drawing
    {
        protected int x = 0;
        protected int y = 0;

        public abstract double Area();

        public string GetCoordinates()
        {
            return string.Format("x: {0}, y: {1}", this.x, this.y);
        }
    }

    class Circle : Drawing
    {
        private int r;

        public Circle(int x, int y, int r)
        {
            this.x = x;
            this.y = y;
            this.r = r;
        }

        public override double Area()
        {
            return this.r * this.r * Math.PI;
        }

        public override string ToString()
        {
            return string.Format("Circle at x: {0}, y: {1}, radius: {2}",
                this.x, this.y, this.r);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var c = new Circle(12, 45, 22);

            Console.WriteLine(c);
            Console.WriteLine("Area of circle: {0}", c.Area());
            Console.WriteLine(c.GetCoordinates());
        }
    }
}

我们有一个抽象基类Drawing。 该类定义两个成员字段,定义一个方法并声明一个方法。 一种方法是抽象的,另一种是完全实现的。 Drawing类是抽象的,因为我们无法绘制它。 我们可以画一个圆,一个点或一个正方形。 Drawing类对我们可以绘制的对象具有一些通用功能。

abstract class Drawing

我们使用abstract关键字定义一个抽象类。

public abstract double Area();

抽象方法之前还带有abstract关键字。

class Circle : Drawing

圆是Drawing类的子类。 它必须实现抽象的Area()方法。

1
2
3
4
public override double Area()
{
    return this.r * this.r * Math.PI;
}

当我们实现Area()方法时,必须使用override关键字。 这样,我们通知编译器我们将覆盖现有的(继承的)方法。

1
2
3
4
$ dotnet run
Circle at x: 12, y: 45, radius: 22
Area of circle: 1520.53084433746
x: 12, y: 45

C# 部分类

使用partial关键字,可以将类的定义拆分到同一名称空间中的几个部分中。 该类也可以在多个文件中定义。

当使用非常大的代码库时可以使用部分类,这些代码库可以拆分为较小的单元。 局部类也与自动代码生成器一起使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Program.
using System;

namespace PartialClass
{
    partial class Worker
    {
        public string DoWork()
        {
            return "Doing work";
        }
    }

    partial class Worker
    {
        public string DoPause()
        {
            return "Pausing";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var worker = new Worker();

            Console.WriteLine(worker.DoWork());
            Console.WriteLine(worker.DoWork());
            Console.WriteLine(worker.DoPause());
        }
    }
}

在示例中,我们将Worker类定义为两部分。 这些部分由编译器连接在一起以形成最终类。

1
2
3
4
$ dotnet run
Doing work
Doing work
Pausing
posted @ 2024-04-05 15:38  一码事  阅读(27)  评论(0编辑  收藏  举报