Вопрос

Я новичок в 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С, как я могу сбить их, где это возможно?

Это было полезно?

Решение

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

  2. Университет - это то, где вы берете базовый класс, а затем пытаетесь превратить его в более конкретный класс. Это может быть достигнуто с помощью использования 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
}

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

Другие советы

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

Спускание Однако должно быть сделано во время выполнения, как правило, компилятор может не всегда знать, является ли рассматриваемый экземпляр данного типа. C# предоставляет для этого два оператора - является который говорит вам, работает ли подавленный, и вернуть true/false. А также в качестве которые пытаются сделать актерский состав и вернуть правильный тип, если это возможно, или нулевой, если нет.

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

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");
  • Аппарат это операция, которая создает ссылку на базовый класс из ссылки на подкласс. (SubClass -> SuperClass) (IE Manager -> Сотрудник)
  • Спускание это операция, которая создает ссылку на подклассы из ссылки на базовый класс. (SuperClass -> subclass) (т.е. сотрудник -> Менеджер)

В твоем случае

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

Вы делаете аппаратуру.

В отличие всегда преуспевает в отличие от спуска, который требует явного состава, потому что он может потенциально выйти из строя во время выполнения.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 

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

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

Ответ 1: Да, это вызвало одобрение, но то, как вы это делаете, это не современный путь. Заказдование может быть выполнено неявно, вам не нужно никакого преобразования. Так просто писать Сотрудник EMP = MGR;достаточно для перекачки.

Ответ 2: Если вы создаете объект класса менеджера, мы можем сказать, что менеджер является сотрудником. Потому что Менеджер класса: сотрудник изображает Это отношения между классом сотрудников и классом менеджера. Таким образом, мы можем сказать, что каждый менеджер является сотрудником.

Но если мы создадим объект класса сотрудников, мы не можем сказать, что этот сотрудник является менеджером, потому что класс -сотрудник это класс, который не наследует ни один другой класс. Таким образом, вы не можете прямо смягчить этот объект класса сотрудников на объект класса менеджера.

Итак, ответ в том, что если вы хотите преодолеть объект класса сотрудников к объекту класса менеджера, сначала у вас должен быть объект класса менеджера сначала, тогда вы сможете его перевернуть, а затем вы сможете понизить его.

Аппинция и понижение:

Заказки: кастинг от полученного класса до базового класса Поучители: кастинг от базового класса до полученного класса

Давайте поймем так же, как пример:

Рассмотрим форму двух классов как мой родительский класс и кружок как производный класс, определяемый следующим образом:

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; }
}

Аппинция:

Форма s = новая форма ();

Круг C = S;

Оба C и S ссылаются на одно и то же местоположение памяти, но оба они имеют разные представления, т. Е. Используя ссылку «C», вы можете получить доступ ко всем свойствам базового класса и полученного класса, но используя ссылку «S», вы можете получить доступ к свойствам единственного родительского класса.

Практическим примером апкапинга является класс потока, который является основанием всех типов считывателя потока .NET Framework:

StreamReader Reader = new StreamReader (new FileStreamReader ());

Здесь FileStreamReader () заполняется Streadm Reder.

Спускание:

Форма s = новый круг (); Здесь, как объяснено выше, View of S является единственным родителем, чтобы сделать это как для родителя, так и для ребенка, нам нужно сбить его с собой

var c = (круг) s;

Практический пример подавления - это кнопка класса WPF.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top