저는 C # (및 OOP )을 처음 사용합니다 . 다음과 같은 코드가있을 때 :
class Employee
{
// some code
}
class Manager : Employee
{
//some code
}
질문 1 :이 작업을 수행하는 다른 코드가있는 경우 :
Manager mgr = new Manager();
Employee emp = (Employee)mgr;
여기 Employee
에는 Manager
있지만 그렇게 캐스트하면 내가 업 캐스트 Employee
한다는 의미입니까?
질문 2 :
여러 개의 Employee
클래스 객체가 있고 일부가 아닌 Manager
경우 가능한 경우 어떻게 다운 캐스트 할 수 있습니까?
답변
-
맞아요. 그렇게 할 때 그것을
employee
객체 로 캐스팅하는 것이므로 관리자와 관련된 어떤 것도 액세스 할 수 없습니다. -
다운 캐스팅은 기본 클래스를 수강 한 다음보다 구체적인 클래스로 전환하는 것입니다. 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
당신은 업 캐스팅을하고 있습니다.
업 캐스트는 런타임에 잠재적으로 실패 할 수 있기 때문에 명시 적 캐스트가 필요한 다운 캐스트와 달리 항상 성공합니다. ( 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
경고 : 업 캐스트를 할 때 슈퍼 클래스의 메서드, 속성 등에 대해서만 액세스 할 수 있습니다.
답변
각 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..
}
답변
답변 1 : 예, 그것은 업 캐스팅이라고 불렀지 만 당신이하는 방식은 현대적인 방식이 아닙니다. 업 캐스팅은 변환이 필요하지 않고 암시 적으로 수행 될 수 있습니다. 그래서 그냥 Employee emp = mgr;
업 캐스팅에 충분합니다.
답 2 : Manager 클래스의 객체를 생성하면 매니저가 직원이라고 말할 수 있습니다. 때문에 클래스 관리자 : 직원이 묘사 되어-A 관계 직원 클래스와 관리자 클래스 사이를. 그래서 우리는 모든 관리자가 직원이라고 말할 수 있습니다.
그러나 Employee 클래스의 객체를 생성하면 Employee 클래스는 다른 클래스를 상속하지 않는 클래스이므로이 직원이 관리자라고 말할 수 없습니다 . 따라서 Employee Class 객체를 Manager Class 객체로 직접 다운 캐스트 할 수 없습니다.
따라서 대답은 Employee Class 객체에서 Manager Class 객체로 다운 캐스트하려면 먼저 Manager Class 객체를 가져야하고 업 캐스트 한 다음 다운 캐스트 할 수 있습니다.
답변
업 캐스팅 및 다운 캐스팅 :
업 캐스팅 : 파생 클래스에서 기본 클래스로 캐스팅 다운 캐스팅 : 기본 클래스에서 파생 클래스로 캐스팅
예와 동일하게 이해합시다.
다음과 같이 정의 된 두 클래스 Shape를 My parent 클래스로, Circle을 Derived 클래스로 간주합니다.
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 = new Shape ();
원 c = s;
c와 s는 모두 동일한 메모리 위치를 참조하지만 둘 다 다른 뷰를 가지고 있습니다. 즉, “c”참조를 사용하면 기본 클래스와 파생 클래스의 모든 속성에 액세스 할 수 있지만 “s”참조를 사용하면 속성에 액세스 할 수 있습니다. 유일한 부모 클래스의.
업 캐스팅의 실제 예는 .net 프레임 워크의 모든 유형의 스트림 리더의 기본 클래스 인 Stream 클래스입니다.
StreamReader 리더 = new StreamReader (new FileStreamReader ());
여기서 FileStreamReader ()는 streadm reder로 업 캐스팅됩니다.
다운 캐스팅 :
모양 s = new Circle (); 여기에서 위에서 설명한 것처럼 s의 뷰는 유일한 부모입니다.
var c = (원) s;
다운 캐스팅의 실제 예는 WPF의 버튼 클래스입니다.