关于c#:抽象类中的受保护的抽象或公共抽象方法

Protected abstract or public abstract method in abstract class

嗨,我有一个抽象类,其中有一些公共方法和抽象方法。我拥有公共的,以便它们实现派生类的公共方法。

让我困惑的是,为什么我要定义一个公共抽象方法而不是受保护的抽象。在抽象类中定义一个公共抽象方法对我来说毫无意义…因为if是一个抽象,在派生类中会被重写,但同样的,if被定义为public,但是在某种程度上,将其定义为protected更有意义,因为我们知道我们将在派生类中重写它。

在抽象类中将方法定义为公共抽象是错误的吗?哪个更好,为什么?


这取决于你想要实现什么。例如,您有一个Television类,它有3个方法:TurnOnTurnOffDraw

您只希望客户使用TurnOnTurnOff电视,但只有其子类才知道屏幕上的Draw是什么以及如何使用。所以,Television看起来或多或少像下面。

1
2
3
4
5
6
7
8
public abstract class Television
{
    public abstract void TurnOn();

    public abstract void TurnOff();

    protected abstract void Draw();
}

然后每个公司都有自己的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public sealed class MyTelevision
    : Television
{
    public override void TurnOn()
    {
        Console.WriteLine("Turn on my tv");
    }

    public override void TurnOff()
    {
        Console.WriteLine("Turn off my tv");
    }

    protected override void Draw()
    {
        // code here.
    }
}

客户可以使用TurnOnTurnOff电视机,但不能在屏幕上使用Draw任何东西。


出于同样的原因,您希望在对象中使用公共方法:)您只是不知道这个阶段的具体实现。它在抽象级别很高的类中很常见,例如中间商。

编辑:100%合法。您只需要确保您希望在每个具体实现中向世界其他地方公开它的功能。入口点方法(例如:start、execute、parse….)通常是这种类型。

UML Examlple of abstract public


抽象类本身必须与继承自它的类一样可访问。因此,如果继承的类是公共的,抽象类也必须是公共的。

公共抽象与其他公共方法具有相同的思想:如果您有一个抽象类,您将传递这个arround。所以,如果应该从外部调用这个方法,它是公共的。如果该方法仅用于子级和父级之间的通信,则需要使用protected。简单示例,以抽象类的用户身份查看主要方法:

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
    static void Main(string[] args)
    {
        Animal cat = new Cat();
        Animal dog = new Dog();

        cat.Eat();
        dog.Eat();

        cat.Move();
        dog.Move();
    }


    public abstract class Animal
    {
        public abstract void Eat();
        protected abstract void ComplexMoving();

        public void Move()
        {
            ComplexMoving();
        }

    }

    public class Dog : Animal
    {
        public override void Eat()
        {
            Debug.WriteLine("Dog says Namnam");
        }

        protected override void ComplexMoving()
        {
            Debug.WriteLine("Dog no stupid");
        }
    }

    public class Cat: Animal
    {
        public override void Eat()
        {
            Debug.WriteLine("Cat says namnam");
        }

        protected override void ComplexMoving()
        {
            Debug.WriteLine("Cat does a slalom");
        }
    }