private GenericClass<T> Test<T>(int i) where T : Base
{
if (i == 42)
{
return new GenericClass<Derived1>();
}
return new GenericClass<Derived2>();
}
같은 베이스 클래스를 가진 파생 클래스 두 가지가 있음
그걸 제네릭 클래스에 넣어서 리턴하고싶음
검색해보니 컴파일러는 일단 제네릭에 들어가면 뭐가 들어갔는지 모른다 같은 식으로 설명하던데
그럼 똑같은 일을 할 수 있는 다른 방법이 있음?
공변반공변 찾아보셈
이건 제네릭이 아니라 그 언어의 Either를 써야하는 상황같은데 - dc App
저건 타입이 전혀 안맞음. 저 타입대로라면 Test라는 함수는 임의의 타입 T에 대해 int를 받아서 GenericClass<T>를 리턴해줘야함
그러니까 T를 결정하는건 Test가 아니라 Test를 호출하는 쪽임. caller쪽에서 아무 T를 정해주면 Test가 그 T에 맞게 동작하는 것.
이 댓글은 게시물 작성자가 삭제하였습니다.
그런데 지금 하려고 하는건 Test 측에서 T를 결정 하는거임. 전혀 다른거야. 이걸 표현하려면 T가 existential하게 들어갈 수 있어야 하는데, 가능한 언어도 있고 안되는 언어도 있음. C#은 어떤지 잘 모르겠다.
Test\(); 로 호출하면 T에 Derived1 들어가는거 아님?
existential type이 없는 언어라면 Either 같은 대안이 있음. 대신 Either는 리턴할 수 있는 타입의 종류를 미리 한정해 줘야 함
꺽쇠가 자꾸 잘리네 Test 꺽쇠 Derived1 꺽쇠(); 하면 될거같은데
ㅇㅇ 그렇게 Derived1 으로 지정하고 호출하면 무조건 GenericClass Derived1을 리턴해야 하는데, 만약 int i 가 42가 아니라면 GenericClass Derived2를 리턴해야 하잖아. 타입이 안맞음
Test(Base)(); 하면 되어야 하는 것 아님?
Base를 넣었을 때에는 말이 되는것처럼 보일 수 있는데, 애초에 제너릭을 쓴다는게 T에다 어떤 타입을 넣든 동작해야 하는거임. Base일 때만 말이 되는건 의미가 없어.
그리고 GenericClass가 공변성을 가지는게 아니라면 GenericClass Derived1이 GenericClass Base의 서브타입이라는 보장도 없어
그렇네 고맙다...
내가 말해줬잖아
T1, T2 받아서 where T1 : GenericClass<T2> where T2 : Base
cannot implicitly convert 뜸
이거 다시보니까 GenericClass 레퍼런스로는 반환 가능하지 않나?
GenericClass<>
T 없이 빈 꺽쇠로 해보라는거?
야이건 니가 언어를 잘못이해하고 쓴거다 병신새끼야
이유를 알려줘야지 그냥 병신이다 하면 내가 뭐라고 대답해야됨
윗놈이 설명해줬는데 내가 굳이 왜또 적으란거임? 븅신새끼가
니가 그걸 이해도 못하고 쓰는것같아서
내말을 존나게 이해못한티 내지말라고
언어 근본이 타입기반인데 니가 쓸줄 모르니까 이런소리가 나는거야
니가 원하는건 타입스크립트쓰는거다 븅신새끼야
살다가 리플렉션용 클래스 반환을 스트래티지 패턴을 쓰는 병신을 다보네
너 보면 본인이 뭔말하는지 모르는거같음
그리고 모르니 물어보지 알면 왜물어보겠니
니가 이해못한걸 내탓으로 돌리지마라 친절히 설명해줬는데 지랄이네 니가 원하는거 타입스크립트쓰라고 해줘도 지랄이네 애미뒤진새끼가
개씨발새끼야 할수없이 설명해줬다고 개새끼야
그리고 스트래티지패턴이아니라 팩토리패턴이다 이건 실수
그래 그거땜에 모르면서 말하는거같다고 한거고 모르면 모른거고 물어봐서 잘 해결했는데 병신이라고 할거까지야 있음?
집안 문화라서 니가 이해해라 병신새끼야
그래도 이게 타입스크립트에서 된다는건 덕분에 알았네 아는거 많으면서 왜 컨셉을 이상하게 잡음
닥쳐 씨발련아
그래 너도 좋은 저녁 보내