2014-12-05 3 views
-4

동물 유형의 목록이 있다고 가정하고 cat 및 dog 유형의 개체를 추가한다고 가정 해 보겠습니다. 고양이와 개 모두 동물을 물려받으며 각각은 자신 만의 분야를 가지고 있습니다.C# 상속 다시 캐스팅

해당 목록에서 해당 개체를 다시 가져 와서 원래의 고양이 또는 개 유형의 Animal로 다시 캐스팅하면 해당 필드가 손실됩니까?

+7

'그 목록에서 물체를 가져 와서 처음에 있었던 것들로 다시 캐스팅하십시오. '....이 질문을하기 전에 해본 적이 있습니까? – ekad

+0

당신은 아무 것도 잃지 않습니다. –

+2

Rep-farmer bait. 어떤 사람들, 일하십시오! – Gusdor

답변

0

여전히 유형 고양이 또는 개의 객체 저장 개체 번호

는, 그들은 단지 일시적으로 폭 넓은 유형 "동물"로 취급되고있다. 당신이 그들을 꺼내어 올바른 유형으로 그들을 성공적으로 던지면 그들은 항상 가지고 있었던 모든 데이터를 볼 수있을 것입니다.

0

아니요. 개체 자체는 항상 같은 형식입니다. 평생 동안 중반에 유형을 변경하지 않습니다. 특정 상황 (목록과 같은)에서 다른 유형으로 취급 될 수도 있지만 그 내용은 변경되지 않습니다.

0

귀하의 질문에 대한 답변은 아니요이며, 분명히 공개 회원 액세스 권한을 잃지 않습니다.

class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      List<Animal> animals = new List<Animal>(); 
      var dog = new Dog(); 
      dog.BallsFetched = 5; 
      var cat = new Cat(); 
      cat.MiceCaught = 23; 
      animals.Add(dog); 
      animals.Add (cat); 

      Console.WriteLine(((Cat)animals [0]).MiceCaught); 
     } 
    } 

    public class Animal{ 
     public string Color; 
     public string Name; 
    } 

    public class Cat : Animal{ 
     public int MiceCaught; 
    } 

    public class Dog : Animal{ 
     public int BallsFetched; 
    } 

또한 객체가 캐스팅하기 전에 특정 선언에 속하는지 확인하기 위해 is operator을 사용할 수 있습니다 여기에

은 예를의 작업을 구현 한 것입니다. 다른 유형으로을 캐스팅 할 때

0

기술적으로 당신은 객체 변환 .

double d = 123.456; 
int i = (int)d; // d value is gone forever 
double dd = (double)i; // you loose .456 part 

그러나, 기본 클래스 (또는 인터페이스) 사실 변환 캐스팅의 경우에서와 발생하지. 이 경우에 캐스팅에 대해 생각해보십시오 (창 (;)을 통해서만) 해당 멤버 만, 새로운 유형이 정의하는 유형 (새 유형 = 기본 클래스) 만 볼 수있는 것처럼 생각하십시오. 다시 캐스팅되면 해당 창을 제거하고 전체 개체를 다시 볼 수 있습니다. 변경 유형에 캐스팅이 있지만이 예

public class A {} 
public class B : A { public object B} 
public class C : B { public object C; } 

var c = new C() { B = 1, C = 2 }; 

에서

당신은

var a = (A)c; // through A window - nothing is visible 

var b = (B)a; 
var test1 = b.B; // you can see something through B window, test1 = 1 

var cc = (C)b; 
var test2 = cc.C; // you can see everything again, test2 = 2 

c 전송할 수 있습니다, 객체는 여전히 동일합니다. 아무것도 잃어 버리지 않는다.