Pergunta

Se você tiver várias classes onde quiser herdar de uma classe base para a funcionalidade comum, você deve implementar a classe base usando uma classe ou uma classe abstrata?

Foi útil?

Solução

Isso depende, se você nunca quer ser capaz de instanciar a classe base, em seguida, torná-lo abstrata. Caso contrário, deixe-o como uma classe normal.

Outras dicas

Se a classe base não deve ser instanciado, em seguida, torná-lo uma classe abstrata -., Se as necessidades da classe base a ser instanciado, então não fazê-lo abstrato

Neste exemplo, faz sentido para fazer a classe base abstrata como a classe base não tem qualquer significado concreto:

abstract class WritingImplement
{
    public abstract void Write();
}

class Pencil : WritingImplement
{
    public override void Write() { }
}

No entanto, neste próximo exemplo, você pode ver como a classe base tem um significado concreto:

class Dog
{
    public virtual void Bark() { }
}

class GoldenRetriever : Dog
{
    public override void Bark() { }
}

É tudo muito subjetivo realmente - você deve ser capaz de fazer uma chamada muito bom julgamento com base nas necessidades do seu domínio particular

.

Depende, faz sentido para a classe base em questão de existir por si própria sem ser derivada? Se a resposta for sim, então deve ser uma classe regular, caso contrário, ele deve ser uma classe abstrata.

Eu sugiro:

  • Faça um interface.
  • Implementar a interface em sua classe de base.
  • Faça a classe base de uma classe real, não abstrato (veja abaixo o porquê).

A razão eu prefiro aulas reais em vez de classes abstratas é que classes abstratas não pode ser instanciado, o que limita as opções futuras desnecessariamente . Por exemplo, mais tarde eu posso precisar o estado e métodos fornecido pela classe base, mas não herdar e pode não precisa implementar a interface; se a classe base é abstrato estou sem sorte, mas se a classe base é uma classe regular, então eu posso criar uma instância da classe base e mantê-lo como um componente da minha outra classe, e delegar a instância para reutilizar o estado / métodos fornecidos.

Sim, isso não acontece muitas vezes, mas o ponto é:. Tornar a classe base impede abstratas este tipo de reutilização / solução, quando não há nenhuma razão para fazê-lo

Agora, se instanciar a classe base, de alguma forma ser perigoso, então torná-lo abstrata - ou, de preferência torná-lo menos perigoso, se possível; -)

Pense nisso como uma conta bancária:

Você pode fazer uma conta de base abstrata genérica chamada "Conta", este contém informações básicas, tais como detalhes do cliente.

Você pode criar duas classes derivadas chamado "SavingAccount" ou "DebitAccount", que pode ter seu próprio comportamento específico embora beneficiando do comportamento da classe base.

Esta é uma situação em que o cliente deve ter ou uma conta poupança ou uma conta de débito, a "Conta" genérico não é permitido, pois não é muito popular no mundo real para ter apenas uma conta de nenhuma descrição.

Se você pode criar um cenário semelhante para as suas necessidades, abstrato é o caminho a percorrer.

Classes abstratas são para aulas parcialmente implementadas.

Por si só não faz sentido ter uma instância de uma classe abstrata, ele precisa ser derivada. Se você gostaria de ser capaz de criar a classe base não pode ser abstrato.

Eu gosto de pensar de classes abstratas como interfaces que têm alguns membros pré-definida, uma vez que são comuns a todas as sub-classes.

Pense nisso uma maneira diferente

É a minha classe base um objeto completo, por si própria?

Se a resposta é não, então torná-lo abstrata. Se for sim, então você provavelmente quer torná-lo uma classe concreta.

Eu diria que se você não está pensando em chamar a classe base, por si só, o então você deve defini-lo como uma classe abstrata.

O depende se você quer a classe base a ser implementado por conta própria ou não.

Como uma classe abstrata, você não pode fazer objetos a partir dele.

As classes abstratas são grandes para a funcionalidade pré-definida, por exemplo - quando conhecer o comportamento mínimo exata uma classe deve expor, mas não os dados que ele deve usar para fazê-lo ou a implementação exata .

abstract class ADataAccess
{
    abstract public void Save();
}

Normal (não abstratas) aulas pode ser ótimo para coisas semelhantes, mas você tem que saber os detalhes de implementação para ser capaz de escrevê-los.

public class DataAccess
{
    public void Save()
    {
        if ( _is_new )
        {
            Insert();
        }
        else if ( _is_modified )
        {
            Update();
        }
    }
}

Além disso, você pode usar interfaces (individualmente ou em classes, seja abstrata ou não) para definir o mesmo tipo de definição protótipo.

interface ISaveable
{
    void Save();
    void Insert();
    void Update();
}

class UserAccount : ISavable
{
    void ISavable.Save() { ... }
    void ISavable.Insert() { ... }
    void ISavable.Update() { ... }
}

No entanto, outra opção pode estar usando os genéricos

class GenDataAccess<T>
{
    public void Save()
    {
        ...
    }
}

Todos estes métodos podem ser usados ??para definir um certo protótipo de classes para trabalhar com ele. Maneiras para se certificar de que o código Um pode falar com código B. E é claro que você pode misturar e combinar todos os itens acima ao seu gosto. Não há maneira certa definido, mas eu como definir interfaces e classes abstratas, em seguida, referindo-se às interfaces. Dessa forma, elimina alguns dos requisitos de pensamento de "encanamento" em classes de nível superior, mantendo o máximo de flexibilidade. (Tendo as interfaces tira a necessidade de usar a classe base abstrata, mas deixa-lo como uma opção).

Eu acho que muitos de vocês devem resit classes básicas OO novamente.

O princípio subjacente básico em OOA / OOD é abstrair abstrato abstrato, até que você não pode não mais abstrato. Se o seu olhar é uma abstração então que assim seja, isso é o que o seu OOA / OOD já lhe disse. No entanto, se você está sentado lá perguntando se "Código" deve ser abstrato ou não, então você obviamente não sabe o que o termo significa e deve ir aprender básica OOA / OOD / OOP novamente: -)

Mais ao ponto que você deve aprender padrões de projeto e Teoria Harmonic, isso vai ajudar com o seu OO projeta imensamente!

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