Digamos que eu tenha esta superclasse:
public class SuperClass { }
E essas subclasses:
public class SubClass1 : SuperClass { }
public class SubClass2 : SuperClass { }
Temos este código de cliente:
public void DoStuff(SuperClass arg)
{
if (arg is instance of SubClass1, but not an instance of SubClass2) // How to check this ?
{
var data = (SubClass1) arg;
// Do stuff
}
}
Como verificar se arg
é um SubClass1
único ou um SubClass2
único?
Uma classe não pode ser
SubClass1
eSubClass2
ao mesmo tempo. Irmãos em uma hierarquia de classes não são compatíveis com atribuições. Portanto, você precisa apenas de uma verificação:Note que estou usando correspondência de padrões aqui. O tipo do objeto é testado e, se corresponder, então é atribuído à variável
data
. Isso declara automaticamentedata
comoSubClass1
.Você também pode usar correspondência de padrões em uma instrução switch:
Se você precisar retornar um valor, uma expressão switch é ainda mais fácil.
Tais usos de
if
ouswitch
são frequentemente uma indicação de que uma abordagem mais orientada a objetos pode resolver melhor o problema. Como exemplo, vamos considerar minha instrução switch acima. Em vez de ligar o (sub-)tipo para decidir seDoStuff1
ouDoStuff2
deve ser executado, poderíamos declarar um método abstrato ou virtualDoStuff
na classe base. As subclasses podem então substituir esse método e implementar suas coisas específicas de tipo. Então, podemos simplesmente chamararg.DoStuff();
.Então
Dada a hierarquia de herança
BaseClass
-->SubClass
-->SubSubClass
, seobj is SubClass
, entãoobj
pode ser aSubClass
ou aSubSubClass
. Mas note que temos um relacionamento pai-filho aqui.Mas isso é aceitável na maioria dos casos, já que
SubSubClass
a atribuição é compatível comSubClass
e pode fazer tudo o que sua classe pai pode fazer. Em POO você não deve se preocupar com o tipo real de um objeto. Exemplo:TextBox
,Label
eComboBox
todos derivam (direta ou indiretamente) deControl
. Se você tem umControl c = Controls[0];
, você pode escrever com segurançac.BackColor = Color.Yellow;
.Você pode usar a correspondência de padrões para fazer a verificação e a atribuição de uma só vez:
Não há necessidade de fazer uma verificação separada
SubClass2
devido à maneira como as classes foram definidas.Se você quiser uma verificação separada para " NÃO é uma subclasse de nenhum tipo", você pode fazer uma comparação usando
GetType()
, como segue:Para a ÚNICA parte da sua pergunta, você precisaria fazer:
arg.GetType()==typeof(SubClass1)
Experimente isto
Embora a questão já tenha sido respondida (por correspondência de padrões ou outras opções), uma abordagem diferente poderia gerar resultados muito melhores (e sustentáveis):
Se sua SuperClasse declara um método abstrato
Então sua SubClass1 e SubClass2 podem fazer coisas diferentes
isso fará com que as subclasses se preocupem com o que elas precisam fazer, em vez de uma classe completamente diferente ter sua lógica.
seu código de cliente também pareceria muito mais simples