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?

Foi útil?

Solução

  1. 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.

  2. 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.

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