기본 클래스 목록에 파생 클래스를 추가 한 다음 C #의 기본 클래스 목록에서 Derived 클래스의 메서드를 호출 할 수 있습니까?

Krell

기본 클래스 목록에 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 방식에 액세스 할 수 있기를 바랍니다.

이것이 분명하기를 바랍니다. 감사

추신 : 당신이 이것에 대한 더 나은 아이디어가 있다면 나는 모두 귀입니다.

MarcinJuraszek

사용 다형성 마크 - Update기본 클래스 virtualoverride파생 클래스에서.

기본 클래스는 가상 메서드를 정의하고 구현할 수 있으며 파생 클래스는이를 재정의 할 수 있습니다. 즉, 자체 정의 및 구현을 제공합니다. 런타임에 클라이언트 코드가 메서드를 호출하면 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관