부모 클래스와 자식 클래스 사이 형변환 (as, is 연산자)[질문1 -this]
*형변환
가능하면 형변환은 피하는게 좋고
불가피 하다면 as 가 안정적이다.
*형변환, as 연산자 비교
as 연산자 => 캐스트 연산자
t= st as MyType; => t=(MyType)st; st를 MYType으로 바
*as 연산자
namespace ConsoleApp_As
{
class Program
{
class Parent
{
}
class Children : Parent
{
public void Method()
{
Console.WriteLine("캐스팅 성공");
}
public void Method1()
{
Console.WriteLine("캐스팅 실패!");
}
}
static void Main(string[] args)
{
Parent parent1 = new Parent();
Parent parent2 = new Children();
Children children = new Children();
//as 사용예제
children = parent1 as Children;
// parent1 --> children 형변환
if (children != null)
{
children.Method();
}
else
{
Console.WriteLine("캐스팅 실패!");
}
// else
// {
// children.Method1();
// }
위와 같은 코드로 대체시 안되는 이유
해결책)
Children children1 = new Children(); 하나를 추가하고
else
{
children1.Method1();
}
이렇게 해주면 인스턴스화로 객체가 하나더 생겼기 때문에 이런식으로 불러오면 된다.
parent1도 초기화를 했지만 as
children = parent1 as Children;
// is 사용하는 예제
// children = parent2 as Children;
//그냥 단순히 형식변환하는 코드
//parent2를 Parent --> Children
if (parent2 is Children)
{
children = (Children)parent2;
children.Method();
}
}
}
}
*업캐스팅(Upcasting)
class Monster
{
public void Attack(){...}
}
class Slime : Monster
{
public void LiqidAttack(){...}
}
class Bubble : Monster
{
public void LiqidAttack(){...}
}
class RibonPig : Monster
{
public void StrikeAttack(){...}
}
class MonsterSpawn
{
public void Spwan(Slime slime) {...}
public void Spwan(Bubble bubbling) {...}
public void Spwan(RibonPig ribbonpig) {...}
}
//업케스팅
class MonsterSpwan
{
public void Spwan(Monster monster){...}
}
자식 클래스의 고유기능을 사용하기 위해 형변환 사용(Type casting)
is ==> 결과를 bool값으로 변환
Monster monster = new Slime();
Slime slime; //굳이 인스턴스화 까지는 안하는듯
if(monster is Slime) ==> 만약에 부모가 자식이라면
{
slime = (Slime)monster; 자식객체 = 부모객체가 자식형태로 바뀜
slime.LiquidAttack(); 자식객체 매서드 사용가능
}
Monster monster = new Bubbling();
Bubbling bubbling = monster as Bubbling;
bubbling?.TailAttack();