Usei um notebook Polyglot do Visual Studio Code e escrevi o seguinte em 3 células separadas, na ordem indicada abaixo.
Célula 1:
class Z;
Célula 2:
class A
{
public static void f()
{
Console.WriteLine(Z.x);
}
}
Célula 3:
class Z: A
{
public static int x = 42;
}
Em seguida, executei as células em ordem e recebi a seguinte mensagem de erro.
'Z' does not contain a definition for 'x'
Minha pergunta original foi:
É possível, em C#, escrever uma classe (possivelmente abstrata)
A
que tenha uma função (possivelmente estática) com assinaturavoid f(B b)
, cujo tipo de parâmetroB
é uma classe (possivelmente abstrata) derivada deA
(class B: A {...}
)? Se não, por que não?
e foi intitulado Uma classe C# pode usar uma classe derivada?
Aceitei a resposta abaixo com base nesta formulação. Esta formulação foi posteriormente excluída por outro usuário que editou minha pergunta e alterou seu título.
O notebook executa as células uma por uma. Então quando você executa a célula 2,
Z
nada mais é do que umclass
, sem qualquer noção dex
. É por isso que você recebe o erro.Não está claro qual comportamento você realmente deseja. Claro que você pode simplesmente escrever o código inteiro em uma única célula:
Portanto o seu problema não está relacionado à herança, mas sim à forma como o Poliglota executa as células. Esteja ciente, porém, de que sua abordagem é bastante estranha. Uma classe base nunca deve fazer suposições sobre classes derivadas; em primeiro lugar, ela nem deveria saber que existem classes derivadas. No entanto, esse é mais um problema conceitual, que é muito amplo para o escopo desta questão.
Sim, claro. Isto é totalmente válido:
É claro que as duas classes precisam estar na mesma montagem, pois precisam se conhecer. A outra pergunta é para um caso de uso relevante, que acho difícil de imaginar. Normalmente, se A for abstrato, você retornaria A's (que então precisam ser tipos derivados de A), e não B's, pois isso impede que você crie posteriormente uma classe C que deriva de A e que substituiria B.
Sim, é possível.
Aqui está um exemplo que segue exatamente o que você solicitou:
Saída:
Demonstração ao vivo
Nota:
Já que você perguntou,
A
e/ouB
também pode ser abstrato.Atualização:
A questão foi editada após a resposta desta resposta, com detalhes adicionais sobre o uso do notebook Poliglota.
Em relação a esta informação adicional: o problema está relacionado à forma como o notebook executa as células uma a uma. Não é um problema relacionado ao C# em geral ou ao uso de herança em particular.