Pergunta

Eu estou desenvolvendo uma biblioteca reutilizável e tem sido a criação de classes abstratas, de modo que o cliente pode, em seguida, estender a partir destes.

PERGUNTA:Existe alguma razão na verdade eu deveria usar uma classe abstrata aqui em oposição a apenas uma classe normal?

Nota - já decidi que eu não quero usar interfaces, como eu quero incluir o padrão real de métodos em minha biblioteca, para que o cliente usando, ele não tem de escrever o código.

EDITAR:Então, eu estou a pesca de quaisquer vantagens não consigo pensar.Por exemplo, ao atualizar a biblioteca seria o uso de uma classe abstrata diminuir o impacto sobre o código do cliente - eu não posso vê-lo seria, neste caso, não?

Foi útil?

Solução

A menos que você queira forçar os usuários finais para herdar a partir de suas classes, não deve haver nenhuma razão para usar resumo.

Se você quiser fazer o seu classes herdadas e facilmente extensível, use virtual em seus métodos e certifique-se de que você tem utilizável protegida construtores.

Outras dicas

A motivação para a classe abstrata é exigir que os clientes substituam a classe. Sua decisão sobre se a classe deve ser abstrata ou não, depende principalmente se o resumo está faltando algum comportamento fundamental que apenas um usuário da classe pode fornecer.

Geralmente, você pode dizer que você precisa que sua classe seja abstrata se usar um método de modelo de algum tipo, onde "Plugue o buraco nesse comportamento" completa a lógica da classe dele. Se sua classe for útil sem alguma lógica fornecida pelo usuário, você provavelmente não precisa que a classe seja abstrata.

Como exemplo, as estruturas geralmente não podem tomar decisões em nome de seus usuários em termos de coisas como validação de estado de objeto, impressão, exibição e assim por diante, e eles precisariam adiar as implementações concretas pelos clientes.

Parece que você está um pouco confuso sobre a diferença entre um método virtual e uma classe abstrata. Você não precisa marcar sua classe como abstrato, a menos que determine que ela não faz sentido por conta própria. Isso é útil em áreas em que você pode ter comportamentos compartilhados entre várias classes.

Parece -me que você só precisa de uma aula regular e alguns métodos virtuais.

A diferença entre uma classe abstrata e uma não abstrante é que você não pode instanciar a primeira e deve ser superestimada. Cabe a você determinar se uma instância da classe base faz ou não sentido por conta própria.

Deixe -me mostrar dois casos. Uma é onde a classe abstrata faz sentido e onde não o faz.

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

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

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

Nesse cenário, temos uma base comum Animal que fornece implementação para Name propriedade. Não faz sentido instanciar o animal por si só, pois não há animais no mundo que são apenas animais, eles são cães ou gatos mais ou menos.

Aqui está um caso em que faz sentido ter uma base não abstraída.

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}, ....){

  }
}

Aqui, o caminho que não é subclassificado faz sentido, podemos criar qualquer forma arbitrária, mas pode ser mais conveniente usar uma subclasse para formas mais específicas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top