Pergunta
Eu sou novo em C# (e OOP). Quando tenho algum código como o seguinte:
class Employee
{
// some code
}
class Manager : Employee
{
//some code
}
Questão 1: Se eu tiver outro código que faça isso:
Manager mgr = new Manager();
Employee emp = (Employee)mgr;
Aqui Employee
é um Manager
, mas quando eu o lancei para um Employee
Isso significa que estou upcasting?
Questão 2:
Quando eu tenho vários Employee
objetos de classe e alguns, mas nem todos são Manager
'S, como posso abaixá -los sempre que possível?
Solução
Está correto. Quando você faz isso, está lançando isso em um
employee
Objeto, o que significa que você não pode acessar nada do gerente específico.Downcasting é onde você faz uma classe base e, em seguida, tenta transformá -la em uma classe mais específica. Isso pode ser realizado com o uso é e um elenco explícito assim:
if (employee is Manager) { Manager m = (Manager)employee; //do something with it }
ou com o as
Operador assim:
Manager m = (employee as Manager);
if (m != null)
{
//do something with it
}
Se algo não estiver claro, ficarei feliz em corrigi -lo!
Outras dicas
Upcasting (usando (Employee)someInstance
) geralmente é fácil, pois o compilador pode dizer no momento da compilação se um tipo for derivado de outro.
Downcasting No entanto, deve ser feito no tempo de execução em geral, pois o compilador nem sempre sabe se a instância em questão é do tipo dado. C# fornece dois operadores para isso - é O que informa se o abatido funciona e retorne verdadeiro/falso. E Como que tenta fazer o elenco e retorna o tipo correto, se possível, ou nulo, se não.
Para testar se um funcionário é gerente:
Employee m = new Manager();
Employee e = new Employee();
if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");
Você também pode usar isso
Employee someEmployee = e as Manager;
if(someEmployee != null) Console.WriteLine("someEmployee (e) is a manager");
Employee someEmployee = m as Manager;
if(someEmployee != null) Console.WriteLine("someEmployee (m) is a manager");
- Upcasting é uma operação que cria uma referência de classe base a partir de uma referência de subclasse. (Subclasse -> Superclass) (IE Manager -> Funcionário)
- Downcasting é uma operação que cria uma referência de subclasse de uma referência de classe base. (Superclass -> subclasse) (ou seja, funcionário -> gerente)
No seu caso
Employee emp = (Employee)mgr; //mgr is Manager
Você está fazendo um upcasting.
Uma upcast sempre é bem -sucedida, diferente de uma abatida que requer um elenco explícito, porque pode falhar potencialmente no tempo de execução. (InvalidCastException).
C# oferece dois operadores para evitar que essa exceção seja lançada:
Começando de:
Employee e = new Employee();
Primeiro:
Manager m = e as Manager; // if downcast fails m is null; no exception thrown
Segundo:
if (e is Manager){...} // the predicate is false if the downcast is not possible
Aviso: Quando você faz um upcast, você só pode acessar os métodos, propriedades, propriedades, etc ...
Caso você precise verificar cada objeto do funcionário, seja um objeto de gerente, use o método oftype:
List<Employee> employees = new List<Employee>();
//Code to add some Employee or Manager objects..
var onlyManagers = employees.OfType<Manager>();
foreach (Manager m in onlyManagers) {
// Do Manager specific thing..
}
Resposta 1: Sim, ele chamou upcasting, mas a maneira como você faz isso não é uma maneira moderna. O upcasting pode ser realizado implicitamente, você não precisa de nenhuma conversão. Então, apenas escrevendo Funcionário emp = mgr;é suficiente para upcasting.
Resposta 2: Se você criar o objeto de classe do gerente, podemos dizer que o gerente é um funcionário. Porque Gerente de classe: funcionário descreve É um relacionamento entre aula de funcionários e aula de gerente. Para que possamos dizer que todo gerente é um funcionário.
Mas se criarmos objeto de classe de funcionários, não podemos dizer que esse funcionário é gerente porque funcionário da classe é uma classe que não está herdando nenhuma outra classe. Portanto, você não pode reduzir diretamente o objeto da classe de funcionários para o objeto de classe do gerente.
Portanto, a resposta é: se você deseja abinar do objeto de classe dos funcionários para o objeto de classe do gerente, primeiro você deve ter a classe Object of Manager primeiro, então poderá acelerá -lo e, em seguida, poderá desligá -lo.
Upcasting e DownCasting:
Upcasting: fundição da classe derivada para a classe baseada: fundição da classe base para a classe derivada
Vamos entender o mesmo que um exemplo:
Considere duas classes moldam como minha classe mãe e círculo como uma classe derivada, definida da seguinte forma:
class Shape
{
public int Width { get; set; }
public int Height { get; set; }
}
class Circle : Shape
{
public int Radius { get; set; }
public bool FillColor { get; set; }
}
Upcasting:
Forma s = nova forma ();
Círculo c = s;
Ambos C e S estão referindo -se ao mesmo local de memória, mas ambos têm visualizações diferentes, ou seja, usando a referência "C", você pode acessar todas as propriedades da classe base e da classe derivada, mas usando a referência "s" Você pode acessar propriedades da única classe pai.
Um exemplo prático de upcasting é a classe de stream, que é uma base de base de todos os tipos de leitor de fluxo da estrutura .NET:
Leitor de streamreader = new StreamReader (new FilestreamReader ());
Aqui, o FileStreamReader () é enviado para o Reder Redm.
Downcasting:
Forma s = new círculo (); Aqui, conforme explicado acima, a visão de S é a única mãe, a fim de fazê -lo para os pais e um filho, precisamos diminuir
var c = (círculo) s;
O exemplo prático de desativação é a classe de botão do WPF.