«Абстрактный класс» против «Нормальный класс» для многоразовой библиотеки

StackOverflow https://stackoverflow.com/questions/2807672

Вопрос

Я разрабатываю многоразовую библиотеку и создаю абстрактные классы, поэтому клиент может затем простираться от них.

Вопрос: Есть ли какие-либо причина на самом деле, я должен использовать абстрактный класс здесь, а не просто обычный класс?

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

Редактировать: Итак, я ловлю любые преимущества, о которых я не могу думать. Например, когда модернизация библиотеки будет использоваться абстрактный класс уменьшается воздействие на клиентский код - я не вижу, что это будет в этом случае нет?

Это было полезно?

Решение

Если вы не хотите заставить конечных пользователей наследовать из ваших классов, не должно быть никаких причин использовать Аннотация.

Если вы хотите сделать ваши классы наследуемыми и легко расширяемыми, использовать виртуальный на ваши методы и убедитесь, что у вас будет использоваться охраняемый конструкторы.

Другие советы

Мотивация для абстрактного класса - требовать от клиентов переопределить класс. Ваше решение о том, должен ли класс быть абстрактным или не зависит прежде всего на том, отсутствует ли реферат некоторое фундаментальное поведение, что только пользователь класса может поставлять.

Обычно вы можете сказать, что вам нужен ваш класс, чтобы быть абстрактным, если вы используете метод шаблона своего рода, где «подключить отверстие в этом поведении» завершает логику класса HE. Если ваш класс полезен без какой-либо поставляемой пользователем логики, вам, вероятно, не нужен класс, чтобы быть абстрактным.

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

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

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

Разница между абстрактным классом и не абстрактным является то, что вы не можете создать бывшую и оно должно быть переопределено. Это действительно зависит от вас, чтобы определить, имеет ли случайный экземпляр базового класса самостоятельно.

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

public abstract class Animal {
  public string Name {get;set;}
}

public class Dog : Animal {
  public Bark(){}
}

public class Cat : Animal {
  public Meaow(){}
}

В этом сценарии у нас есть общая база Animal это обеспечивает реализацию для Name имущество. Это не имеет смысла создавать зрелище животных, так как в мире нет животных, которые являются лишь животными, они хотят собаки или кошки или что-то еще.

Вот случай, когда имеет смысл иметь не абстрактную базу.

class Path {
  public Path(IList<Point> points) {
    this.Points = new ReadOnlyCollection<Point>(points);
  }
  public ReadOnlyCollection<Point> Points {get;}
}

class RectanglePath : Path{
  public SquarePath (Point origin, int height, int width) : 
   base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){

  }
}

Здесь путь, который не подклассно, имеет смысл, мы можем создать любую произвольную форму, но может быть удобнее использовать субласс для более специфических форм.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top