Microsoft MVP성태의 닷넷 이야기
Object 질문 있어요. [링크 복사], [링크+제목 복사],
조회: 6035
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

안녕하세요!

앞에 두 질문에 답변해 주셔서 정말 감사드립니다.

제가 시작하세요! C# 8.0 145 ~ 147쪽을 읽고

아래 코드의 문제점을 해결하려고 계속 고민을 해도 해결되지 않아 질문을 드립니다.

namespace ConsoleApp36
{
    class GreetingMorning
    {
        public string GetMessage()
        {
            return "Good morning";
        }
    }

    class GreetingAfternoon
    {
        public string GetMessage()
        {
            return "Good Afternoon";
        }
    }

    class GreetingEvening
    {
        public string GetMessage()
        {
            return "Good Evening";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<object> greetings = new List<object>()
            {
                new GreetingMorning(),
                new GreetingAfternoon(),
                new GreetingEvening()
            };
            foreach (object obj in greetings)
            {
                string msg = obj.GetMessage(); // 빨간 밑줄이 생기는 지점.
                Console.WriteLine(msg);
            }
        }
    }
}
foreach 문 안에 있는 obj.GetMessage()의 GetMessage에 빨간 밑줄이 없어지지 않습니다.
제 추측인데 greetings에서 obj로 업캐스팅이 하면서 문제가 되는 것 같은데
교재 146쪽에 보면 "결국 C#에서 정의되는 모든 클래스의 부모는 Object가 된다."를 읽으면
별 문제가 되지 않는 것 같기도 합니다...
어떤 점이 틀렸는지 알려주세요^^

오늘도 좋은 하루 보내세요!












[최초 등록일: ]
[최종 수정일: 11/27/2020]


비밀번호

댓글 작성자
 



2020-11-27 11시06분
모든 인스턴스가 obj로 캐스팅이 되는 것은 맞습니다. 단지, 그것의 타입이 System.Object인데 그 타입에는 GetMessage 메서드가 없으므로 빨간 밑줄이 그어지는 것입니다. C#은 동적 언어가 아닌 정적 언어이므로 형식 안정성이 최우선입니다. 따라서 그런 식의 메서드 호출은 허용하지 않습니다.

그게 가능하려면, GetMessage를 갖는 타입으로 다시 형변환을 한 다음 호출을 해야 합니다.

string msg = null;
if (obj is GreetingMorning)
{
    msg = ((GreetingMorning)obj).GetMessage();
}
else if (obj is GreetingAfternoon)
{
    msg = ((GreetingAfternoon)obj).GetMessage();
}
else if (obj is GreetingEvening)
{
    msg = ((GreetingEvening)obj).GetMessage();
}

혹은, 나중에 "4.4.1" 절의 메서드 오버라이드 또는 4.5.1.4 절의 '인터페이스'를 배우고 나면 저렇게 일일이 해당 타입으로 형변환하지 않고 사용하는 방법을 알게 됩니다.


정성태

... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4966포플러3/30/20189691    답변글 [답변]: C# 응용프로그램 (Winform)에서 unhandledexception 발생시 프로그램이 죽는 현상 이외에 재부팅될 수도 있을까요? [1]
4961김민욱3/26/201810604레이더 뷰어의 구현 방법(이미지 확대 축소 관련) [2]
4960hurd...3/18/201810334OCX 관련한 질문을 드리고자 합니다. [1]
4959익명3/10/20189323교재 199page 델리게이트와 object를 이용한 범용 정렬 코드 [1]
4957멍멍이2/13/20189956System.Console - WriteLine함수의 제너릭 사용 [1]
4956김성대2/12/20189282asp.net 질문입니다. [1]
4955웅이2/12/20189718[삭제] WPF에서 list 속도 향상하는 방법이 있을까요?
4954초보자2/8/201811536FFT Library 사용 [1]
4950ASP열공2/5/20189306asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4951ASP열공2/6/201810281    답변글 [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4952ASP열공2/7/20189443        답변글 [답변]: [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다. [1]
4953ASP열공2/7/20188960            답변글 [답변]: [답변]: [답변]: asp.net 과 C# 을 이용해서 홈페이지 만드는 질문입니다.
4949김성대1/31/201810644비동기 질문입니다. [3]파일 다운로드1
494880511/31/20189434C# 7.1책 보다가 질문드립니다 [1]
4947김성대1/30/201810647[삭제] 비동기 질문입니다. [2]파일 다운로드2
4946윤현수1/29/201810216비동기 TCP통신 데이터 문제 [4]파일 다운로드1
4945김성대1/26/20188764비동기 질문입니다. [1]파일 다운로드1
4944popo1/25/20188199[삭제] 스레드 안에서 Window Visibility 변경시 DialogResult 오류 질문
4943김성대1/22/20189179FromAsync 질문입니다. [1]
4942박현일1/19/201810785WPF 공부중 모르는 문법이 있어서요~^^; [2]
4941김성대1/18/20189064비동기예약어 실행오류관련입니다. [1]
4940plzh...1/10/20189937webbrowser2 를 이용한 sns 로그인 구현 관련 문의 [2]
4939이성일1/4/201811439ClickOnce 배포 후 업데이트 시 발생하는 오류에 대해 질문 드립니다. [2]
4938김성대1/3/20189516채팅 프로그램관련 질문입니다. [9]파일 다운로드1
4937Ques...1/3/201811893C# CPU 사용량 한계치 늘리는 방법 [2]
4936무개1/3/20189026책 내용 인용하는 것에 관한 질문이있습니다. [1]파일 다운로드1
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...