문제

나는 새롭다 씨# (그리고 OOP). 다음과 같은 코드가있을 때 :

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

질문 1: 다른 코드가있는 경우 :

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

여기 Employee a 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#은이를 위해 두 개의 연산자를 제공합니다. ~이다 다운 캐스트가 작동하는지 알려주고 참/거짓을 반환합니다. 그리고 ~처럼 캐스트를 시도하고 가능하면 올바른 유형을 반환하거나 그렇지 않은 경우 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 emp = (Employee)mgr; //mgr is Manager

당신은 업 캐스트를하고 있습니다.

Upcast는 런타임에 잠재적으로 실패 할 수 있기 때문에 명백한 캐스트가 필요한 다운 캐스트와 달리 항상 성공합니다.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 : 관리자 클래스의 객체를 만드는 경우 관리자가 직원이라고 말할 수 있습니다. 왜냐하면 수업 관리자 : 직원 묘사 IS-A 관계 직원 수업과 관리자 수업 사이. 따라서 우리는 모든 관리자가 직원이라고 말할 수 있습니다.

그러나 우리가 직원 클래스의 대상을 만들면이 직원이 관리자라고 말할 수 없습니다. 클래스 직원 다른 클래스를 물려받지 않는 수업입니다. 따라서 해당 직원 클래스 객체를 관리자 클래스 객체에 직접 다운 캐스트 할 수 없습니다.

따라서 대답은 직원 클래스 객체에서 관리자 클래스 객체로 다운 캐스트하려면 먼저 관리자 클래스의 객체가 있어야합니다. 그러면 먼저이 클래스의 개체가 있어야합니다. 그런 다음 다운 캐스트 할 수 있습니다.

업 캐스트 및 다운 캐스팅 :

업 캐스트 : 파생 등급에서 기본 클래스 다운 캐스팅으로 캐스팅 : 기본 클래스에서 파생 클래스로 캐스팅

예와 같은 것을 이해합시다.

두 개의 클래스 모양을 부모 수업으로 고려하고 서클이 파생 클래스로 다음과 같이 정의됩니다.

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 = 새로운 모양 ();

Circle C = S;

C와 S는 모두 동일한 메모리 위치를 참조하고 있지만 두 가지 모두 "C"참조를 사용하여 다른 뷰를 가지고 있습니다. 기본 클래스 및 파생 클래스의 모든 속성에 액세스 할 수 있지만 "S"참조를 사용하면 속성에 액세스 할 수 있습니다. 유일한 부모 클래스의.

업 캐스트의 실질적인 예는 .NET 프레임 워크의 모든 유형의 스트림 판독기의베이스 클래스 인 스트림 클래스입니다.

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

여기에서 FileStreamReader ()는 Streadm Reder로 업 캐스트됩니다.

다운 캐스팅 :

Shape S = New Circle (); 위에서 설명한 바와 같이, S의 견해는 유일한 부모입니다. 부모와 자녀 모두를 위해 그것을 다운 캐스트해야합니다.

var c = (원) s;

다운 캐스팅의 실질적인 예는 WPF의 버튼 클래스입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top