首页 文章

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

提问于
浏览
3

嗨,我有一个抽象类,其中有一些公共方法和一些抽象方法 . 我有公众,所以他们实现派生类的常用方法 .

令我困惑的是为什么我想要定义一个公共抽象方法而不是保护抽象 . 我在抽象类中定义一个公共抽象方法是没有意义的....因为如果是一个抽象将被覆盖,在派生类中,但同样如果被定义为公共,但不知何故,它更有意义定义它受到保护,因为我们知道我们将在派生类中覆盖它 .

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

3 回答

  • 5

    出于同样的原因,您需要对象中的公共方法:)您只是不知道此阶段的特定实现 . 它在具有非常高抽象级别的类中很常见,例如中间件 .

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

    UML Examlple of abstract public

  • 1

    这取决于你想要达到的目标 . 例如,您有一个 Television 类,它有3个方法, TurnOnTurnOffDraw .

    您只希望客户端 TurnOnTurnOff 电视,但只有其子类应该知道屏幕上的内容和方式 Draw . 所以, Television 看起来或多或少会像下面那样 .

    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.
        }
    }
    

    客户可以 TurnOnTurnOff 一台电视机但屏幕上不能有任何东西 Draw .

  • 8

    Abstract Class本身必须像继承它的Classes一样可访问 . 因此,如果继承的Classes是Public,则Abstract Class也必须是公共的 .

    Public Abstract与其他公共方法具有相同的想法:如果你有一个抽象类,你将传递这个arround . 因此,如果此方法应该从外部调用,那么它是公开的 . 如果该方法仅用于Child和Parent之间的通信,则保护是可行的方法 . 简单的示例,请参阅Main-Method作为抽象类的用户:

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

相关问题