기본 클래스 목록에 Derived 클래스를 추가 한 다음 기본 클래스 목록에서 Derived 클래스의 메서드를 호출 할 수 있습니까? (원래 Derived 클래스라는 것을 알고 있으므로 Derived 클래스로 다시 캐스팅하여)
public class MySystem
{
public string name;
MySystem(string name)
{
this.name = name;
}
public void Update()
{
//dostuff
}
}
public class PowerSystem : MySystem
{
public int totalPower;
PowerSystem (string name, int power) : base(name)
{
this.totalPower = power;
}
public void Update()
{
base.Update();
//Do other stuff
}
}
void Main()
{
List<MySystem> SystemList = new List<MySystem>();
SystemList.Add(new System("Shields"));
SystemList.Add(new System("Hull"));
Power p = new Power("Power", 10);
SystemList.Add(p);
foreach(MainSystems ms in SystemList)
{
if(ms.name != "Power")
ms.Update();
else
(PowerSystem)ms.Update(); //This doesn't work
}
}
그래서 내가하려는 것은 목록의 모든 요소에 대해 power라는 이름을 제외하고 대신 Power.Update 메서드를 실행하여 업데이트 메서드를 실행하는 것입니다.
나는이 대답에 발견 한 가장 가까운 포스트는 여기 불행하게도 내가 완전히 이해하지 않습니다.
목록에 PowerSystem p에 대한 참조가 포함되어 있고 어떻게 든 변환하고 PowerSystem 방식에 액세스 할 수 있기를 바랍니다.
이것이 분명하기를 바랍니다. 감사
추신 : 당신이 이것에 대한 더 나은 아이디어가 있다면 나는 모두 귀입니다.
사용 다형성 마크 - Update
기본 클래스 virtual
와 override
파생 클래스에서.
기본 클래스는 가상 메서드를 정의하고 구현할 수 있으며 파생 클래스는이를 재정의 할 수 있습니다. 즉, 자체 정의 및 구현을 제공합니다. 런타임에 클라이언트 코드가 메서드를 호출하면 CLR은 개체의 런타임 유형을 조회하고 가상 메서드의 재정의를 호출합니다. 따라서 소스 코드에서 기본 클래스의 메서드를 호출하고 파생 클래스의 메서드 버전이 실행되도록 할 수 있습니다.
public class MySystem
{
public string name;
MySystem(string name)
{
this.name = name;
}
public virtual void Update()
{
//dostuff
}
}
public class PowerSystem : MySystem
{
public int totalPower;
PowerSystem (string name, int power) : base(name)
{
this.totalPower = power;
}
public override void Update()
{
base.Update();
//Do other stuff
}
}
이제 PowerSystem.Update()
자동으로 호출됩니다
foreach(MainSystems ms in SystemList)
{
ms.Update();
}
대한 MySystem
인스턴스가 호출 MySystem.Update
하지만, 대한 PowerSystem
인스턴스 재정이 호출됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다