Como o projeto de herança pode causar um custo extra? [fechadas]

12

Então, eu queria herdar de um sealed classem csharp e me queimei. Simplesmente não há como separá-lo, a menos que você tenha acesso à fonte.

Então isso me fez pensar "por que sealedexiste?". há 4 meses. Não consegui descobrir, apesar de ler muitas coisas, como:

Eu tentei digerir tudo isso desde então, mas é demais para mim. Eventualmente, ontem eu tentei novamente. Examinei todos eles novamente e mais alguns:

Finalmente, depois de muita reflexão, decidi editar fortemente a pergunta original com base no novo título.

A velha pergunta era muito ampla e subjetiva. Era basicamente perguntando:

  1. No título antigo: Um bom motivo para usar selado
  2. No corpo: Como modificar corretamente uma classe selada? Esqueça a herança? Usar composição?

Mas agora, entendendo (o que eu não fiz ontem) que tudo sealedfaz é impedir a herança , e nós podemos e devemos realmente usar a composição sobre a herança , percebi que o que eu precisava era de exemplos práticos .

Acho que minha pergunta aqui é (e de fato sempre foi) exatamente o que o Sr.Mindor me sugeriu em um bate - papo : como o design de herança pode causar um custo extra?

cregox
fonte
5
A pergunta é redigida de forma bastante agressiva e soa como um discurso retórico. Você deve reformulá-lo se quiser respostas relevantes e objetivas.
eufórico
11
Veja Por que tantas classes de estrutura são seladas? de Eric Lippert. Ele fornece várias boas razões para selar aulas.
Robert Harvey
9
Então você não leu o artigo. Volte e leia novamente. Tudo se resume a isso: você não pode prever as inúmeras maneiras pelas quais um cliente pode quebrar sua classe estendendo-a. Você pode culpar seus clientes por isso, mas é você quem terá que apoiá-los.
Robert Harvey
4
@Cawas Ele poderia, ou você poderia ler o artigo que ele vinculou, que o explica em detalhes. Ele estava apenas resumindo esse artigo com seu comentário.
Servy
7
Desculpe, mas não sou eu quem está reclamando aqui. A resposta para sua pergunta é muito simples: sele uma classe quando você não deseja apoiar a herança. É isso aí.
Robert Harvey

Respostas:

27

Isso não é tão difícil de entender. sealedfoi criado ESPECIFICAMENTE para a Microsoft, a fim de facilitar suas vidas, economizar muito dinheiro e ajudar sua reputação. Como é um recurso de idioma, todos os outros também podem usá-lo, mas você provavelmente nunca precisará usar o selo.

A maioria das pessoas reclama que não consegue estender uma aula e, se o fizerem, dizem que todo mundo sabe que é responsabilidade dos desenvolvedores fazê-la funcionar corretamente. Isso está correto, EXCETO essas mesmas pessoas não têm idéia do histórico do Windows e um dos problemas sealedestá tentando resolver.

Vamos supor que um desenvolvedor estendeu uma classe principal .Net (porque não existia lacrado) e a fez funcionar perfeitamente. Yay, para o desenvolvedor. O desenvolvedor entrega o produto ao cliente. O aplicativo do desenvolvedor funciona muito bem. O cliente está feliz. A vida é boa.

Agora, a Microsoft lança um novo sistema operacional, que inclui a correção de bugs nessa classe principal .Net específica. O cliente deseja acompanhar os horários e escolhe instalar o novo sistema operacional. De repente, o aplicativo que o cliente tanto gosta não funciona mais, porque não levou em conta os bugs corrigidos na classe principal .Net.

Quem é o culpado?

Quem conhece a história da Microsoft sabe que o novo sistema operacional da Microsoft será o culpado, e não o software aplicativo que utilizou mal as bibliotecas do Windows. Portanto, torna-se tarefa da Microsoft corrigir o problema, em vez da empresa de aplicativos que criou o problema. Essa é uma das razões pelas quais o código do Windows ficou inchado. Pelo que li, o código do sistema operacional Windows está repleto de if-then específicos, para verificar se um aplicativo e uma versão específicos estão em execução e, em caso afirmativo, faça um processamento especial para permitir que o programa funcione. É muito dinheiro gasto pela Microsoft para corrigir a incompetência de outra empresa.

O uso sealednão elimina completamente o cenário acima, mas ajuda.

Dunk
fonte
4
@Cawas É muito difícil abusar. Eric Lippert afirmou em várias ocasiões que ele deseja que as classes, como os métodos, sejam todas sealedpor padrão, a menos que sejam especificamente lacradas, simplesmente porque poucas classes são realmente projetadas para serem herdadas. É muito mais provável que sua turma não tenha sido criada para dar suporte a ela, e você deve garantir que gastou esse tempo de desenvolvimento se estiver se esforçando para marcá-la como não lacrada.
Servy
1
Eu acho que se as pessoas usam selado para seu software de desenvolvimento interno, provavelmente o estão usando incorretamente ou estão perdendo tempo da empresa tentando ser perfeitas demais. Digo provavelmente porque sempre há casos em que se pode fazer sentido em algum cenário específico. No entanto, para aqueles que desenvolvem software do tipo biblioteca, eu suspeitaria que fosse muito útil pelos mesmos motivos que a Microsoft decidiu que era necessário.
Dunk
2
@Cawas A grande maioria das classes escritas pela maioria dos desenvolvedores nunca precisará ser herdada e não são escritas para dar suporte à herança. Isso pode ser transmitido de maneira rápida e eficaz aos leitores / usuários do código, fazendo o tipo sealed. Se de fato fosse a opção padrão, isso significaria que se alguém estivesse herdando de um tipo, saberia que ele foi criado para suportá-lo.
Servy
2
Cancelar a selagem de uma classe não significaria que a classe foi construída para apoiá-la. Significa apenas que alguém queria herdar da classe e destravá-la. Na melhor das hipóteses, o uso de selado simplesmente fará com que os desenvolvedores reescrevam a funcionalidade existente (equivalente à classe selada), mas mais frequentemente, se o código-fonte estiver disponível, eles simplesmente o selarão sem levar em consideração as consequências. Tendo selado ser específico e raramente definido, é melhor porque o desenvolvedor pode querer descobrir por que essa classe é selada. Muitas aulas seladas e eles não se importarão com o porquê.
Dunk
1
Também a segurança é uma razão para usá-lo! Considere um aplicativo em área restrita tentando acessar um arquivo. A caixa de areia pode testar as seqüências de caracteres de nome de arquivo, mas e se um invasor puder enviar uma mutável para ele String e depois a mutação após a verificação de segurança, mas antes da E / S? Acredito que esse tipo de cenário é o motivo pelo qual o Java Stringé marcado final(semelhante a sealed) e aposto que a mesma lógica está subjacente a algumas decisões em C #.
Darien
23

sealedé usado para indicar que o escritor da classe não a projetou para ser herdado. Nada menos, nada mais.

Projetar adequadamente uma interface já é bastante difícil para muitos programadores. O design adequado de uma classe que pode ser potencialmente herdada adiciona dificuldade e linhas de código. Mais linhas de código escritas significa mais código a ser mantido. Para evitar essa dificuldade crescente, sealedpode mostrar que a classe nunca teve a intenção de ser herdada e , nesse contexto, selar uma classe é uma solução perfeitamente válida para um problema .

Imagine o caso de onde a classe CustomBoeing787é derivada Airliner. Isso CustomBoeing787substitui alguns métodos protegidos de Airliner, mas não todos. Se o desenvolvedor tiver tempo suficiente e valer a pena, ele poderá testar a classe da unidade para garantir que tudo funcione conforme o esperado, mesmo em um contexto em que métodos não substituídos sejam chamados (por exemplo, setters protegidos que alteram o estado do objeto). Se o mesmo desenvolvedor (1) não tiver tempo, (2) não quiser gastar centenas ou milhares de dólares adicionais de seu chefe / cliente, ou (3) não quiser escrever código adicional, ele não terá precisa agora (YAGNI), então ele pode:

  • libere o código como está, considerando que é a preocupação dos programadores que manterão esse projeto posteriormente para se preocupar com possíveis erros,

  • ou marque a classe de modo sealeda mostrar explicitamente aos futuros programadores que essa classe não se destina a ser herdada e que a remoção do lacre e a utilização como pai devem ser feitas por sua conta e risco.

É uma boa idéia selar o maior número possível de classes ou o menor número possível? Da minha experiência, não há resposta definitiva. Alguns desenvolvedores tendem a usar sealeddemais; outros não se importam com como a classe seria herdada e com o problema que ela pode causar. Dado esse uso, o problema é semelhante ao que consiste em determinar se os programadores devem usar dois ou quatro espaços para indentação: não há resposta certa.

Arseni Mourzenko
fonte
Tudo bem ... Desculpe se pareço agressivo novamente, mas só quero ser claro e assertivo aqui ... Só consigo entender o que você acabou de escrever de duas maneiras, se você escrever tl;draqui. Ou é "Não, não existe uma única boa razão" ou "Acho que não há uma boa razão, mas também não sei". . Para mim, "nenhuma resposta definitiva" é uma delas.
cregox 4/09/13
6
sealedé usado para indicar que o escritor da classe não a projetou para ser herdado. Essa é sua única razão.
9788 Robert
Essa é uma boa razão para dar a você uma bicicleta sem luzes e impor, de alguma forma, você não pode adicionar luzes.
cregox 4/09/13
2
@Cawas Como assim? Nesse contexto, não é importante para o fabricante da bicicleta garantir que a bicicleta não tenha luz, mas geralmente é importante para o usuário de um tipo garantir que a implementação seja uma implementação exata específica. Você impõe as restrições necessárias. Em alguns casos, as pessoas podem adicionar uma restrição que não é realmente necessária; você forneceu um exemplo disso. Só porque a restrição é mal usada em um só lugar não significa que você nunca deve restringir nada.
Servy
1
Também a segurança é uma razão para usá-lo! Considere um aplicativo em área restrita tentando acessar um arquivo. A caixa de areia pode testar as seqüências de caracteres de nome de arquivo, mas e se um invasor puder enviar uma mutável para ele String e depois a mutação após a verificação de segurança, mas antes da E / S? Acredito que esse tipo de cenário é o motivo pelo qual o Java Stringé marcado final(semelhante a sealed) e aposto que a mesma lógica está subjacente a algumas decisões em C #.
Darien
4

Quando uma classe é selada, permite que o código usando esse tipo saiba exatamente com o que está lidando.

Agora em C # stringé sealed, você não pode herdar a partir dele, mas vamos supor que por um segundo que isso não era o caso. Se você fez, alguém poderia escrever uma aula como esta:

public class EvilString// : String
{
    public override string ToString()
    {
        throw new Exception("I'm mean");
    }
    public override bool Equals(object obj)
    {
        return false;
    }
    public override int GetHashCode()
    {
        return 0;
    }
}

Agora, essa seria uma classe de string que viola todos os tipos de propriedades que os designers stringsabiam serem verdadeiras. Eles sabiam que o Equalsmétodo seria transitivo, não é. Caramba, esse método equals nem é simétrico, pois uma string pode ser igual a ela, mas não seria igual a essa string. Tenho certeza de que existem todos os tipos de programadores que escreveram código sob a suposição de que o ToStringmétodo stringnão lançará uma exceção para valores não nulos. Agora você poderá violar essa suposição.

Há várias outras classes pelas quais poderíamos fazer isso e todos os tipos de outras suposições que poderíamos violar. Se você remover o recurso de idioma parasealedagora os designers de idiomas precisam começar a contabilizar coisas como essa em todo o código de sua biblioteca. Eles precisam executar todos os tipos de verificações para garantir que os tipos estendidos dos tipos que desejam usar sejam gravados "corretamente", o que pode ser uma coisa muito cara a se fazer (tanto em tempo de desenvolvimento quanto em tempo de execução). Ao poder selar uma classe, eles podem garantir que isso não seja possível e que quaisquer afirmações feitas sobre os detalhes de implementação de seus próprios tipos não possam ser violadas, exceto para aqueles que foram projetados intencionalmente para serem estendidos. Para aqueles tipos projetados para serem estendidos, você encontrará que o código do idioma precisa ser muito mais defensivo sobre como ele lida com eles.

Servy
fonte
Mas você pode violar essa suposição no seu código . Não é como se você estivesse pegando a fonte de String e editando-a. Os designers não precisariam dar conta disso, porque é 1 folha, 1 filial, 1 cliente usando-a por sua própria conta e risco. Não será divulgado a partir daí, a menos que outros clientes prefiram fazê-lo. E assim por diante.
cregox 4/09/13
3
@Cawas E se uma exceção for lançada em um momento inesperado e um recurso for vazado como resultado, ou uma classe for deixada em um estado indeterminado e funcionar de forma inadequada? Este caso é um pouco tolo, mas pode ser facilmente o caso de alguém escrever uma implementação que julgue ser sensata, mas ocasionalmente lança quando não deveria ou não funciona com determinados valores. Eles reclamarão quando o código do idioma não funcionar. É preferível não deixar as pessoas fazerem coisas que o idioma não será capaz de suportar.
Servy
De qualquer forma, você está falando sobre a construção de um compilador. Existem muitos desses sealedrecursos incorporados que não estão expostos para uso. Ainda não explica por que usá-lo fora de um escopo tão restrito e, sendo tão estreito quanto o código do compilador , nem explica a sealedexistência.
cregox 4/09/13
2
@Cawas O stringtipo não é código do compilador. Faz parte do código do idioma. Completamente diferente. De qualquer forma, acabei de escolher um exemplo. Você pode escolher quase todas as classes seladas em todo o BCL e usá-las como exemplo.
Servy
4
@ Cayas: Eu acho que o que você pode estar perdendo aqui é o aspecto do suporte ao cliente. Se você permitir que uma classe seja herdada, os clientes a herdarão e, em seguida, ligarão para você quando ela quebrar. Você pode dizer a eles durante todo o dia que eles herdam dessa classe por seu próprio risco, mas você ainda receberá a ligação, porque permitiu que eles herdassem dela, de modo que eles assumem que é seguro fazê-lo.
Robert Harvey
3

Existe algum bom motivo para usar selado?

Enh? Não frequente. Eu só utilizado selado quando eu tenho um tipo imutável (ou alguma outra limitação) que realmente realmente precisa permanecer imutável e não posso herdeiros de confiança para afeções medulares essa exigência sem introduzir sutis, bugs catastropic no sistema.

Suponha que exista uma boa razão para usar selado e que devamos usá-lo como padrão para tudo, o que fazemos com herança?

Usamos herança para coisas que não são padrão. Mesmo que a composição seja preferida à herança (e é), isso não significa que a herança deva ser descartada. Isso significa que a herança tem alguns problemas intrínsecos que ela introduz no design e na manutenção e composição do código e faz a mesma coisa com (em geral) menos problemas. E isso significa que, mesmo que a composição seja favorecida, a herança é boa para certos subconjuntos de problemas.

Não pretendo ser muito mesquinha, mas se você já ouviu falar do SOLID e dos testes de unidade, talvez deva sair de debaixo da rocha e escrever um código. As coisas não são claras, e raramente "sempre faz X" ou "nunca usa Y" ou "Z é o melhor" é o caminho certo (como parece que você se baseia em pontos de vista da sua pergunta). Ao escrever o código, você pode ver casos em que isso sealedpode ser bom e casos em que isso causa luto - como qualquer outra troca.

Telastyn
fonte
Para mim, isso e o "para evitar ter que dar suporte à herança para clientes" que Robert não deseja elaborar são as respostas mais promissoras ... Talvez você possa elaborar mais sobre os casos em que usa sealed, por favor?
cregox 4/09/13
@ Cayas - Não tenho certeza se posso bem. Raramente faço isso, e geralmente é uma troca em que a garantia de que algo permanece imutável (para fazer otimizações de desempenho, simplificação de design) vale a incapacidade de herdar do objeto.
Telastyn
Isso é legal. Dunk já a molhou! : P Muito obrigado pela resposta. E você foi o único a captar minhas "dicas sutis" sobre meus conhecimentos. Parece que as pessoas estavam assumindo que eu sabia mais, não sei ... Mas eu gostaria que "apenas codificar" me tirasse dessa rocha. Talvez eu aplique esses conceitos de alguma forma, mas não tão processualmente quanto provavelmente deveria.
Cregox # 4/13
3

Antes de tudo, você deve ler o post de Eric Lippert sobre por que a Microsoft encerra suas aulas.

http://blogs.msdn.com/b/ericlippert/archive/2004/01/22/61803.aspx

Em segundo lugar, a palavra-chave selada existe para fazer exatamente o que faz - impedir a herança. Existem muitas situações em que você deseja impedir a herança. Considere uma classe da qual você tem uma coleção. Se seu código depende dessa classe funcionando de uma maneira específica, você não deseja que alguém substitua um dos métodos ou propriedades nessa classe e cause falha no aplicativo.

Em terceiro lugar, o uso de selado incentiva a composição sobre a herança, o que é um bom hábito. Usar composição sobre herança significa que você não pode violar o princípio de substituição de Liskov e está seguindo o princípio de Aberto / Fechado. sealedé, portanto, uma palavra-chave que ajuda você a seguir dois dos cinco princípios mais importantes da programação oo. Eu diria que o torna um recurso muito valioso.

Stephen
fonte
A primeira parte já está apontada nos comentários da pergunta. A segunda parte é apenas mais raciocínio sem causas reais. A terceira parte, embora já tenha sido abordada em outro lugar, pode ter algo a ver. Eu focaria nisso.
cregox 5/09/13
o terceiro ponto não incentiva a composição sobre a herança, elimina completamente a herança como uma opção, mesmo que essa fosse a melhor escolha geral.
Michael Shaw
Isso depende se você controla a base de código ou não. Se você selar classes, sempre poderá selá-las mais tarde, se necessário.
Stephen
2

Penso que esta pergunta não tem resposta objetiva e que tudo depende da sua perspectiva.

Por um lado, algumas pessoas querem que tudo seja "aberto" e o ônus de garantir que tudo esteja funcionando corretamente é da pessoa que estende a aula. É por isso que as classes estão abertas à herança por padrão. E por que os métodos Java são todos virtuais por padrão.

Por outro lado, alguns querem que tudo seja fechado por padrão e oferecem opções para abri-lo. Nesse caso, é o autor da classe base que precisa garantir que tudo o que ele abre "seja aberto" seja seguro de usar de qualquer maneira imaginável. É por isso que em C # todos os métodos são não virtuais por padrão e precisam ser declarados virtuais para serem substituídos. É também para essas pessoas que precisam ser uma maneira de contornar os padrões "abertos". Como tornar a aula selada / final, porque eles vêem alguém que deriva da classe um grande problema para o design de sua própria classe.

Eufórico
fonte
É mais assim! Esta pode ser uma boa razão ... "Porque as pessoas querem fechar". E é também o que estou tentando dizer na pergunta: parece que classes não virtuais em C ++ podem ser substituídas. sealednão posso. Como podemos herdar deles? Tudo o que li é que não podemos. Sempre. Eu não sei. Eu estou indo e voltando sobre esse assunto há 4 meses, desde que ouvi falar pela primeira vez sobre o assunto. E ainda não sei como fazer isso corretamente quando preciso modificar qualquer coisa em uma classe selada. Então, não vejo "opção para abri-lo"!
Cregox # 4/13
4
Não é por isso que os métodos da classe C ++ não são virtuais por padrão. Tornar um método virtual significa que deve haver uma sobrecarga adicional na tabela de pesquisa de métodos, e o C ++ tem a filosofia de que você paga apenas pela sobrecarga quando deseja o recurso.
Michael Shaw
@Ptolemy Ok, eu removi. Eu nunca deveria ter escrito, porque sabia que as pessoas começaram a reclamar.
eufórico
hey, eu aprecio completamente que se você quer alegação de que as pessoas querem escrever turmas fechadas por padrão, e tem que escolher ativamente para abri-los, então você vai ter que agarrar em palhas
Michael Shaw
A IMO é extremamente semelhante aos debates privados / protegidos / públicos quando se trata de APIs: depende fortemente de quem controla a classe, de quem deseja herdar a classe, da comunicação entre as duas e da frequência com que novas versões são lançadas.
Darien
-2

o problema com selado em c # é que é bastante final. Em 7 anos de desenvolvimento comercial em C #, o único lugar que eu já vi usado é nas classes Microsoft .NET, onde sinto que tinha um motivo legítimo para estender uma classe de estrutura para implementar um comportamento ajustado e, como a classe foi selada, não consegui .

É impossível escrever uma classe pensando em todas as formas possíveis de usá-la e decidindo que nenhuma delas é legítima. Da mesma forma, se a segurança da estrutura depende da classe não ser herdada, você tem uma falha no design de segurança.

Portanto, em conclusão, sou firmemente da opinião de que o selo não serve para nenhum propósito útil, e nada que li até agora mudou essa visão.

Eu posso ver que até agora houve três argumentos que justificam selado colocado até agora.

  1. O argumento 1 é que ele elimina uma fonte de erros quando as pessoas herdam das classes e aumentam o acesso aos internos dessa classe sem realmente entender os internos adequadamente.

  2. O argumento 2 é que, se você estender uma classe da Microsoft e, em seguida, a Microsoft implementar uma correção de bug nessa classe, mas sua extensão dependesse desse bug, seu código será quebrado agora, a Microsoft será responsabilizada e a lacuna impedirá que

  3. O argumento 3 é que, como desenvolvedor da classe, é minha escolha se você deseja estendê-la, como parte do meu design da classe.

O argumento 1 parece ser um argumento de que você, o programador final, não sabe como usar meu código. Pode ser esse o caso, mas se você ainda me permite acessar a interface de objetos, ainda é verdade que estou usando seu objeto e fazendo chamadas sem entender como usá-lo, e pode causar tanto dano dessa maneira . Essa é uma justificativa fraca da necessidade de selar.

Eu entendo de onde vem a base factual para arg 2. Em particular, quando a microsoft colocou verificações adicionais do sistema operacional nas chamadas da API do win32 para identificar chamadas malformadas, que melhoraram a estabilidade geral do Windows XP em comparação ao Windows NT, mas a curto prazo, muitos aplicativos foram quebrados quando o Windows XP foi lançado. A Microsoft resolveu isso colocando 'regras' para que essas verificações digam: ignore quando o aplicativo X quebrar essa regra, é um bug conhecido

O argumento 2 é um argumento fraco, porque, na melhor das hipóteses, lacrado não faz diferença, porque se houver um erro na biblioteca .NET, você não terá outra opção a não ser encontrar uma solução alternativa e, quando a correção da Microsoft for lançada, é bem provável significa que o seu trabalho em torno do qual depende o comportamento quebrado agora está quebrado. Independentemente de você ter contornado isso usando herança ou algum outro código adicional do wrapper, quando o código for corrigido, sua solução será quebrada.

O argumento 3 é o único argumento que tem alguma substância para justificar a si próprio. Mas ainda é fraco. Isso simplesmente contraria a reutilização de código.

Michael Shaw
fonte
2
/ me envia um email para a microsoft, você pode remover a classe X para mim e enviar uma nova versão do .NET. Atenciosamente, .... Como eu disse, a única vez em desenvolvimento comercial que vi uma classe selada, não foi possível destravá-la.
Michael Shaw
6
It is impossible to write a class thinking about every possible way it could be used- Essa é precisamente a razão pela qual muitas classes do Framework são seladas ... Isso elimina a necessidade de pensar em todas as formas possíveis de estender a classe.
Robert Harvey
5
Se você pudesse desencaixá-lo, não faria muito sentido selá-lo, haveria?
Robert Harvey
2
@Ptolemy Permitir que as pessoas estendam sua classe é um recurso . Um que consome uma quantidade significativa de esforço de desenvolvimento. É um recurso que vale a pena justificar se o autor da classe puder ver benefícios suficientes em extensões em potencial para justificar o esforço. Se eles não puderem justificar o esforço e, portanto, o tipo e seus usuários não forem criados para oferecer suporte à extensão, é importante evitá-lo; caso contrário, você poderá estender tecnicamente o tipo, mas é improvável que funcione corretamente quando você faz isso.
Servy
2
@ Cayas: Você está apenas sendo difícil.
Robert Harvey
-7

Eu só uso sealedpalavras-chave em classes que contêm apenas métodos estáticos.

Vladimir Kocjancic
fonte
9
Então, por que não apenas marcar a classe static?
Servy
@ Service ... Bom ponto.
Vladimir Kocjancic
-8

Como é evidente pela minha pergunta, não sou especialista aqui. Mas não vejo razão para sealedexistir.

Parece ter sido feito para ajudar os arquitetos de código a projetar uma interface. Se você deseja escrever uma classe que sairá em estado selvagem e muitas pessoas herdarão dela, modificar qualquer coisa nessa classe pode quebrá-la para muitas pessoas. Então podemos selar e ninguém pode herdar. "Problema resolvido".

Bem, parece "cobrir um ponto e descobrir outro". E nem está resolvendo um problema - está apenas eliminando uma ferramenta : herança. Como qualquer ferramenta, ela tem muitos usos e herdar de uma classe instável é um risco que você corre. Quem correu esse risco deveria saber melhor.

Talvez possa haver uma palavra-chave stable, para que as pessoas saibam que é mais seguro herdar dela.

cregox
fonte
2
"Problema resolvido" - Exatamente.
Robert Harvey
@RobertHarvey Não está resolvido, conforme explicado no próximo parágrafo.
Cregox # 4/13
8
Você está bravo porque não pode estender a aula. Isso não significa que sealednão seja uma ferramenta útil para os designers de estruturas. Classes em uma estrutura devem ser caixas pretas; você não precisa conhecer os internos de uma turma para poder usá-la adequadamente. No entanto, é exatamente isso que a herança exige.
Robert Harvey
Eu nunca disse que não é útil. Eu digo que não vejo seu uso e indico o porquê. Por favor, estou te implorando, me dê um bom motivo para usá-lo! Mesmo que seja apenas "porque eu quero seguir um padrão de design fechado", tudo bem. Não vejo ninguém explicando essa razão.
Cregox # 4/13
7
A boa razão é que você não precisa apoiar a herança em uma classe selada.
Robert Harvey