Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象类中受保护的抽象或公共抽象方法_C#_Oop_Abstract_Protected - Fatal编程技术网

C# 抽象类中受保护的抽象或公共抽象方法

C# 抽象类中受保护的抽象或公共抽象方法,c#,oop,abstract,protected,C#,Oop,Abstract,Protected,嗨,我有一个抽象类,其中有一些公共方法和一些抽象方法。 我使用了public,以便它们实现派生类的通用方法 让我困惑的是,为什么我要定义一个公共抽象方法而不是受保护的抽象方法。在抽象类中定义公共抽象方法对我来说毫无意义。。。。因为if是一个抽象将在派生类中被重写,但if定义为public也是一样的,但不知何故,将其定义为protected更有意义,因为我们知道,我们将在派生类中重写它 在抽象类中将方法定义为公共抽象是错误的吗?哪个更好?为什么?出于同样的原因,您希望在对象中使用公共方法:) 您只

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

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


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

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

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


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

公共抽象与其他公共方法具有相同的思想:如果您有一个抽象类,那么您将通过此函数。所以,如果这个方法应该从外部调用,它是公共的。如果这种方法只是为了孩子和父母之间的交流,那么保护就是最好的方法。简单示例,请参见作为抽象类用户的Main方法:

    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");
        }
    }

这取决于你想要实现什么。例如,您有一个
TV
类,该类有3个方法,
打开
关闭
,和
绘制

您只希望客户端
打开
关闭
电视,但只有其子类应该知道在屏幕上绘制什么以及如何绘制。因此,
电视
的外观大致如下

public abstract class Television
{
    public abstract void TurnOn();

    public abstract void TurnOff();

    protected abstract void Draw();
}
然后每个公司都有自己的实现

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.
    }
}
客户端可以
打开
关闭
电视,但不能
在屏幕上绘制任何内容