2015-05-21 2 views
2

Привет У меня есть абстрактный класс, в котором у меня есть некоторые общедоступные методы и некоторые абстрактные. У меня есть публика, чтобы они реализовали общие методы для производных классов.Защищенный абстрактный или публичный абстрактный метод в абстрактном классе

Что меня смущает, поэтому я хочу определить публичный абстрактный метод вместо защищенного абстрактного. Для меня нет смысла определять публичный абстрактный метод в абстрактном классе .... потому что, если абстракция будет переопределена, в производных классах, но то же самое, если она определена как общедоступная, но как-то имеет смысл определить он защищен, поскольку мы знаем, что мы переопределим это в производных классах.

Неправильно ли определять метод как публичный аннотация в абстрактном классе? Что лучше и почему?

ответ

5

По той же причине вы хотите публичный метод в объекте :) Вы просто не знаете конкретную реализацию на данном этапе. Это обычное явление в классах с очень высоким уровнем абстракции, например, middlewares.

Редактировать: Он является 100% законным. Вам просто нужно быть уверенным, что это функциональность, которую вы хотите представить всему остальному миру в каждой конкретной реализации. Методы точки входа (например: start, execute, parse ..) обычно имеют такой тип.

UML Examlple of abstract public

1

Конспект сам класс должен быть доступен как классы, которые наследуют от него. Поэтому, если унаследованные классы являются общедоступными, абстрактный класс также должен быть общедоступным.

Публичный реферат имеет ту же идею, что и другие общедоступные методы. Если у вас есть абстрактный класс, вы пройдете этот аркан. Поэтому, если этот метод следует вызвать извне, он является общедоступным. Если метод предназначен только для связи между дочерним и родительским, защита - это путь. Простой пример, см. Основной метод в качестве пользователя абстрактного класса:

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

Это зависит от того, чего вы хотите достичь. Например, у вас есть класс Television, который имеет 3 метода: TurnOn, TurnOff и Draw.

Вы хотите, чтобы клиенты только TurnOn или TurnOff телевизора, но только его подкласс должен знать, что и как 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. 
    } 
} 

Клиенты могут TurnOn или TurnOff с телевизором, но не может Draw ничего на экране.

Смежные вопросы