침체 및 낙상
저는 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
경고 : 업 캐스트를 할 때 슈퍼 클래스의 메서드, 속성 등에 대해서만 액세스 할 수 있습니다.
In case you need to check each of the Employee object whether it is a Manager object, use the OfType method:
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..
}
Answer 1 : Yes it called upcasting but the way you do it is not modern way. Upcasting can be performed implicitly you don't need any conversion. So just writing Employee emp = mgr; is enough for upcasting.
Answer 2 : If you create object of Manager class we can say that manager is an employee. Because class Manager : Employee depicts Is-A relationship between Employee Class and Manager Class. So we can say that every manager is an employee.
But if we create object of Employee class we can not say that this employee is manager because class Employee is a class which is not inheriting any other class. So you can not directly downcast that Employee Class object to Manager Class object.
So answer is, if you want to downcast from Employee Class object to Manager Class object, first you must have object of Manager Class first then you can upcast it and then you can downcast it.
Upcasting and Downcasting:
Upcasting: Casting from Derived-Class to Base Class Downcasting: Casting from Base Class to Derived Class
Let's understand the same as an example:
Consider two classes Shape as My parent class and Circle as a Derived class, defined as follows:
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();
Circle c= s;
Both c and s are referencing to the same memory location, but both of them have different views i.e using "c" reference you can access all the properties of the base class and derived class as well but using "s" reference you can access properties of the only parent class.
A practical example of upcasting is Stream class which is baseclass of all types of stream reader of .net framework:
StreamReader reader = new StreamReader(new FileStreamReader());
here, FileStreamReader() is upcasted to streadm reder.
Downcasting:
Shape s = new Circle(); here as explained above, view of s is the only parent, in order to make it for both parent and a child we need to downcast it
var c = (Circle) s;
The practical example of Downcasting is button class of WPF.
참고URL : https://stackoverflow.com/questions/1524197/downcast-and-upcast
'Development Tip' 카테고리의 다른 글
IDENTITY 열이 하나만있는 테이블에 삽입하는 방법은 무엇입니까? (0) | 2020.10.07 |
---|---|
asp.net mvc 프로젝트의 이미지를 어디에 저장하고 site.master에서 어떻게 참조합니까? (0) | 2020.10.07 |
PHP 5.3 및 세션 폴더 관련 문제 (0) | 2020.10.07 |
defaultdict의 default_factory에 키를 전달하는 영리한 방법이 있습니까? (0) | 2020.10.07 |
gdb에 코어 파일 저장 (0) | 2020.10.07 |