언어 자료구조 알고리즘/Escort C#

[C#] 7.4 프로젝트 구현 - 초점이 도서관 (책 읽기, 세미나)

언제나휴일 2016. 5. 3. 13:48
반응형

7.4 프로젝트 구현

 

초점이 도서관 (책 읽기, 세미나)



세미나 시퀀스 다이어그램

[그림] 세미나 시퀀스 다이어그램


책 읽기 시퀀스 다이어그램

[그림] 책 읽기 시퀀스 다이어그램


 이번에는 초점이 도서관에 왔을 때 수행하는 세미나와 책 읽기에 대한 부분을 구현하기로 합시다. 앞에서 초점이 강의실에 왔을 때 수행하는 부분과 구현하는 방법이 크게 다르지 않겠지요.

 

class CampusLife

{

    ... 중략 ...

    private void FocusAtLibrary(Library library)

    {

        ConsoleKey key;

        while ((key = SelectLibMenu()) != GameRule.ExitKey)

        {

            switch (key)

            {

                case GameRule.LI_Seminar: StartSeminar(library); break;

                case GameRule.LI_Reading: StartReading(library); break;

                default: Console.WriteLine("잘못된 메뉴를 선택하였습니다."); break;

            }

            Console.WriteLine("아무키나 누르세요. ");

            Console.ReadKey();

        }

    }

 

    private void StartReading(Library library)

    {

        ViewStuInfoInPlace(library);

        Console.WriteLine("책 읽기를 할 학생 번호를 입력하세요.");

        int num = EHLib.GetNum();

        library.DoIt(GameRule.CMD_LI_Reading, num);

    }

 

    private void StartSeminar(Library library)

    {

        library.DoIt(GameRule.CMD_LI_Seminar);

    }

 

    private ConsoleKey SelectLibMenu()

    {

        Console.Clear();

        Console.WriteLine("도서관 메뉴");

        Console.WriteLine("{0} 세미나", GameRule.LI_Seminar);

        Console.WriteLine("{0} 책 읽기", GameRule.LI_Reading);

        Console.WriteLine("{0} 캠퍼스 생활로 돌아가기", GameRule.ExitKey);

        return Console.ReadKey().Key;

    }

}

 

 이제 시퀀스 다이어그램을 보면서 세미나를 구현해 보기로 합시다. Library클래스의 입력 인자가 한 개 오는 DoIt 메서드도 LectureRoom에서 구현했던 것과 큰 차이가 없겠죠.

 

class Library:Place

{

    ... 중략 ...

    internal override void DoIt(int cmd)

    {

        switch (cmd)

        {

            case GameRule.CMD_LI_Seminar: StartSeminar(); break;

            default: return;

        }

    }

    private void StartSeminar()

    {

        int cnt = GetStuCount();

        Student student = null;

        for (int i = 0; i < cnt; i++)

        {

            student = GetStudent(i);

            student.ListenSeminar();

        }

    }

    internal override void DoIt(int cmd, int snum)

    {

        Student student = this[snum];

        if (student == null)

        {

            Console.WriteLine("{0}번 학생은 없습니다.", snum);

            return;

        }

        switch (cmd)

        {

            case GameRule.CMD_LI_Reading: StartReading(student); break;

            default: return;

        }

    }

    private void StartReading(Student student)

    {

        student.Reading();

    }

}

 

 이제 시나리오를 보면서 Student 클래스에 ListenSeminar 메서드를 구현합시다. 단순히 시나리오에 나와있는 것에 따라 능력치를 변경하면 될 것입니다. 그리고 Student 클래스는 추상 클래스로 하는 것이 적절하므로 abstract 키워드를 추가하겠습니다. 이처럼 어떠한 단계에서든 잘못되었다고 생각이 들면 바로 고치세요.

 

abstract class Student

{

    ... 중략 ...

    internal void ListenSeminar()

    {

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

        Console.WriteLine("세미나를 듣다.");

        Iq += 5;

        Hp -= 4;

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

   }

    internal virtual void Reading()

    {

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

        Console.WriteLine("책을 읽다.");

        Iq += 2;

        Cp += 2;

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

    }

}

 

 특히, 책을 읽는 행위에서 도전적인 학생은 추가로 대화 능력이 1올라가야 합니다. 이를 위해 Student Reading 메서드는 가상 메서드로 지정을 하였습니다. 그리고 CStudent에서는 이를 재정의해 주어야 하겠죠. CStudent Reading 메서드에서는 기반 클래스의 Reading 메서드를 base 키워드를 이용하여 호출한 후에 추가로 대화 능력을 변경합니다.

 

class CStudent:Student

{

   ... 중략 ...

    internal override void Reading()

    {

        base.Reading();

        Cp += 1;

        Console.WriteLine("도전적인 학생, 추가로 대화 능력에 변화: {0}", Cp);

    }

}


너와 나의 연결고리 "공감" 


반응형