KoreanFoodie's Study

C# : 정적 멤버의 타입 캐스팅? 본문

Tutorials

C# : 정적 멤버의 타입 캐스팅?

GoldGiver 2022. 8. 3. 10:30

싱글턴 패턴과 정적 변수?

싱글턴 패턴을 공부하던 중, 게으른 초기화 성질을 이용해 싱글턴을 상속하는 방법에 대해 배웠다.
부모 클래스의 virtual 메소드를 부를 때, 자식 클래스의 instance 를 부모 클래스의 instance 타입으로 타입 캐스팅하는 방식이 가능할까?

정적 변수는 상속이 되지 않는다. 엄밀히 말하면, 정적 변수는 '상속' 되는 것이 아니라 '공유'되는 것이다.
또한 싱글턴 특성 상, instance 라는 이름으로 자식 클래스에서 똑같이 받으면, 부모 클래스의 instance 를 hide 하게 되므로, 부모 클래스의 virtual 메소드를 호출할 수 없다. 아래에 간단한 테스트 코드를 넣어 놓았다.

using System;

public class Parent
{
    public static Parent instance;
    
    public static int val = 5;
    
    public Parent()
    {
        instance = this;
    }
    
    public virtual void foo()
    {
        Console.WriteLine("Parent!");
    }
}

public class Child : Parent
{
    public static Child instance;
    
    public static float val = 10.0f;
    
    public Child()
    {
        instance = this;
        
        val += 1;
    }
    
    public override void foo()
    {
        Console.WriteLine("Child!");
    }
}


public class HelloWorld
{
    public static void Main(string[] args)
    {
        Parent p = new Parent();
        Child c = new Child();
        
        p.foo(); // Parent!
        c.foo(); // Child!
        
        // 스태틱 멤버 클래스를 타입 캐스팅해서 Parent 의 virtual 함수를 호출할 수 있을까?
        Parent childToParent = (Parent) Child.instance;
        // 안된다! static 한 instance 는 각각의 타입에 종속된다
        childToParent.foo(); // Child!
        
        Console.WriteLine(Parent.val); // 5
        Console.WriteLine(Child.val); // 11.0
    }
}

Comments