안녕하세요. 최근에 코드를 리팩토링하면서
언어적으로 부족한 부분이 많아 C#을 다시 공부하고 있습니다
그러던 도중 이해가 안가는 코드가 있어 질문드립니다
<코드>
using System;
using System.Collections.Generic;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var temp = new ImplClassA
{
Values = new List<InterfaceB>
{
new ImplClassB{ Value = "A" },
new ImplClassB{ Value = "B" },
new ImplClassB{ Value = "C" },
new ImplClassB{ Value = "D" },
new ImplClassB{ Value = "E" },
}
};
DoSomething(temp);
}
public static void DoSomething(InterfaceA iParam)
{
foreach (var item in (iParam as ImplClassA).Values)
{
Console.WriteLine((item as ImplClassB).Value);
}
}
}
interface InterfaceA { }
interface InterfaceB { }
class ImplClassA : InterfaceA
{
public List<InterfaceB> Values { get; set; }
}
class ImplClassB : InterfaceB
{
public string Value { get; set; }
}
}
ImplClassA, ImplClassB는 각각 InterfaceA, InterfaceB를 구현하지만
각 Interface에는 아무런 코드가 없고 구현되는 클래스에서만 프로퍼티가 있는 상황입니다.
Main 메소드에서 ImplClassA 인스턴스를 만들고 DoSomething 메소드에 인자값으로 넘겨주고 있습니다.
DoSomething 메소드에서 InterfaceA만을 매개변수로 받지만
ImplClassA는 InterfaceA를 상속하고 있으므로
형변환이 일어나서 ImplClassA를 매개변수로 받는데 문제가 없다는것까지는 이해를 했습니다.
하지만 다음코드부터 의문이 생깁니다.
InterfaceA를 다시 ImplClassA로 형변환을 하는데 InterfaceA내부에는 프로퍼티가 아무것도 없습니다.
이런 상황에서 매개변수로 받은 ImplClassA의 값들을 다시 사용할 수 있습니다.
InterfaceB를 ImplClassB로 형변환한경우도 마찬가지구요…
보통의 인터페이스 예제들을 보면 인터페이스 내부에 프로퍼티를 정의해놓는 경우가 많아서
대충 이해를 했었는데 이러한 코드는 처음 봐서 이게 어떻게 가능한건지 답변주시면 감사하겠습니다.
추가로 용어가 이상한 부분이나 제가 잘못 이해하고 있는 부분 지적부탁드립니다.