потупив и upcast



Я новичок в C#ОП). Когда у меня есть следующий код:



class Employee
{
// some code
}


class Manager : Employee
{
//some code
}


Вопрос 1: если у меня есть другой код, который делает это:



   Manager mgr = new Manager();
Employee emp = (Employee)mgr;


здесь Employee это Manager, но когда я бросил его так, чтобы Employee это значит, что я повышаю его?



Вопрос 2:



когда у меня есть несколько Employee объекты класса и некоторые, но не все из них Manager ' s, как можно Я опускаю их, где это возможно?

1038   5  

5 ответов:

  1. это правильно. Когда вы делаете это, вы бросаете его в employee объект, так что это означает, что вы не можете получить доступ к чему-либо конкретного менеджера.

  2. Downcasting-это когда вы берете базовый класс, а затем пытаетесь превратить его в более конкретный класс. Это может быть достигнуто с помощью is и явного приведения следующим образом:

    if (employee is Manager)
    {
        Manager m = (Manager)employee;
        //do something with it
    }
    

или as оператор как это:

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

если что-то непонятно, я буду рад исправить это!

Upcasting (через (Employee)someInstance), как правило, легко, как компилятор может сказать вам во время компиляции, если тип является производным от другого.

Downcasting однако это должно быть сделано во время выполнения в целом, поскольку компилятор не всегда может знать, является ли рассматриваемый экземпляр заданным типом. C# предоставляет для этого два оператора -и который говорит вам, если downcast работает, и возвращает true/false. И как который пытается делать приведение и возвращает правильный тип, если это возможно, или null, если нет.

чтобы проверить, является ли сотрудник менеджером:

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");

вы также можете использовать этот

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");

Если вам нужно проверить каждый объект Employee, является ли он объектом Manager, используйте метод 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..
}
  • Upcasting - это операция, которая создает ссылку на базовый класс из ссылки на подкласс. (подкласс - > суперкласс) (т. е. менеджер -> сотрудник)
  • Downcasting - это операция, которая создает ссылку на подкласс из ссылки на базовый класс. (суперкласс - > подкласс) (т. е. сотрудник -> менеджер)

в вашем случае

Employee emp = (Employee)mgr; //mgr is Manager

вы делаете upcasting.

апкаст всегда удается в отличие от downcast, который требует явного приведения, потому что он потенциально может завершиться неудачей во время выполнения.(InvalidCastException).

C# позволяет использовать двух операторов, чтобы избежать это исключение быть брошенным:

начиная с:

Employee e = new Employee();

первый:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

второй:

if (e is Manager){...} // the predicate is false if the downcast is not possible 

предупреждение: когда вы делаете upcast, вы можете получить доступ только к методам суперкласса, свойствам и т. д...

Upcasting и Downcasting:

Upcasting: приведение из производного класса в базовый класс Downcasting: приведение из базового класса в производный класс

давайте разберемся так же, как на примере:

рассмотрим два класса Shape как мой родительский класс и Circle как производный класс, определенный следующим образом:

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:

Shape s = new Shape ();

круг c= s;

оба c и s являются ссылки на одну и ту же ячейку памяти, но оба они имеют разные представления, т. е. с помощью ссылки "c" вы можете получить доступ ко всем свойствам базового класса и производного класса, а также с помощью ссылки "s" Вы можете получить доступ к свойствам только родительского класса.

практическим примером upcasting является класс Stream, который является базовым классом всех типов stream reader .net framework:

StreamReader reader = new StreamReader(new FileStreamReader ());

здесь, FileStreamReader () передается в streadm reder.

Downcasting:

форма s = новый круг(); здесь, как объяснено выше, вид s является единственным родителем, чтобы сделать его как для родителя, так и для ребенка, нам нужно опустить его

var c = (круг) s;

практическим примером нисходящей передачи является класс button WPF.

Comments

    Ничего не найдено.