언어 자료구조 알고리즘/프로그래밍 실습

[C#] 상속과 다형성, 인터페이스 실습 - 도형

언제나휴일 2019. 8. 10. 09:53
반응형

실습 ) 다음 시나리오에 맞게 프로그램을 작성하시오.

도형
도형 ID를 순차적으로 부여합니다.
추상 메서드로 Draw 메서드를 제공합니다.
파생 형식에서도 접근 가능한 가져오기 ID 속성을 제공합니다.


x와 y 좌표 멤버를 갖습니다.
생성자에서 x, y 좌표를 입력 인자로 받습니다.
Draw 메서드를 재정의합니다.


두 개의 점을 멤버로 갖습니다.
생성자에서 두 점의 x, y 좌표를 입력 인자로 받습니다.
Draw 메서드를 재정의합니다.

IGetArea
GetArea 를 멤버로 갖는 인터페이스입니다.

사각형
왼쪽 상단 좌표(left, top)와 우측 하단 좌표(right, bottom)를 멤버로 갖습니다.
생성자에서 왼쪽 상단 좌표와 우측 하단 좌표를 입력 인자로 받습니다.
Draw 메서드와 GetArea 메서드를 재정의합니다.

*2019년 공주대에서

설계 도면

Diagram.cs

using System;

namespace 인터페이스_실습_도형
{
    /// <summary>
    ///  도형 - 추상 클래스
    /// </summary>
    public abstract class Diagram
    {
        readonly int id;//도형 ID, 주요 키로 사용
        static int lastid;//도형 ID를 순차적으로 부여하기 위한 정적 멤버
        /// <summary>
        /// 생성자
        /// </summary>
        public Diagram()
        {
            lastid++;
            id = lastid;//읽기 전용의 값은 선언문 혹은 생성자에서 설정할 수 있다.
        }
        /// <summary>
        /// 그리다 - 추상 메서드
        /// </summary>
        public abstract void Draw();
        /// <summary>
        /// ID 속성 - 가져오기
        /// </summary>
        public int ID
        {
            get
            {
                return id;
            }
        }
    }
}

Point.cs

using System;

namespace 인터페이스_실습_도형
{
    /// <summary>
    /// 점 - Diagram 형식에서 파생
    /// </summary>
    public class Point : Diagram
    {
        int x;
        int y;
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="x">x좌표</param>
        /// <param name="y">y좌표</param>
        public Point(int x,int y)
        {
            this.x = x;
            this.y = y;
        }
        /// <summary>
        /// 그리다 메서드 재정의
        /// </summary>
        public override void Draw()
        {
            Console.WriteLine("점({0},{1})", x, y);
        }
    }
}

Line.cs

using System;

namespace 인터페이스_실습_도형
{
    /// <summary>
    /// 선 - Diagram 형식에서 파생
    /// </summary>
    public class Line:Diagram
    {
        Point p1;
        Point p2;
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="x1">시작 점의 x좌표</param>
        /// <param name="y1">시작 점의 y좌표</param>
        /// <param name="x2">끝 점의 x좌표</param>
        /// <param name="y2">끝 점의 y좌표</param>
        public Line(int x1,int y1,int x2,int y2)
        {
            p1 = new Point(x1, y1);
            p2 = new Point(x2, y2);
        }
        /// <summary>
        /// 그리다 메서드 재정의
        /// </summary>
        public override void Draw()
        {
            Console.WriteLine("===선===");
            Console.Write("시작 ");
            p1.Draw();
            Console.Write("끝 ");
            p2.Draw();
        }
    }
}

IGetArea.cs

namespace 인터페이스_실습_도형
{
    /// <summary>
    /// 인터페이스 - 면적을 계산할 수 있다.
    /// </summary>
    public interface IGetArea
    {
        int GetArea();
    }
}

Rectangle.cs

using System;
namespace 인터페이스_실습_도형
{
    /// <summary>
    ///  사각형 클래스 - Diagram 형식에서 파생, IGetArea 형식을 실현
    /// </summary>
    public class Rectangle:Diagram,IGetArea
    {
        int left;
        int top;
        int right;
        int bottom;
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="left">사각형의 왼쪽 좌표</param>
        /// <param name="top">사각형의 상단 좌표</param>
        /// <param name="right">사각형의 오른쪽 좌표</param>
        /// <param name="bottom">사각형의 오른쪽 좌표</param>
        public Rectangle(int left,int top,int right,int bottom)
        {
            this.left = left;
            this.top = top;
            this.right = right;
            this.bottom = bottom;
        }

        /// <summary>
        /// 면적을 계산하는 메서드 - IGetArea 인터페이스에서 약속한 메서드
        /// </summary>
        /// <returns>면적</returns>
        public int GetArea()
        {
            int area = (right - left) * (bottom - top);
            return Math.Abs(area);
        }
        /// <summary>
        /// Area 속성 - 가져오기
        /// </summary>
        public int Area
        {
            get
            {
                return GetArea();
            }
        }

        /// <summary>
        /// 그리다 메서드 재정의
        /// </summary>
        public override void Draw()
        {
            Console.WriteLine("===사각형===");
            Console.WriteLine("({0},{1},{2},{3})", left, top, right, bottom);
            Console.WriteLine("면적:{0}", GetArea());
        }

    }
}

Program.cs

using System;
using System.Collections.Generic;

namespace 인터페이스_실습_도형
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Diagram> list = new List<Diagram>();
            list.Add(new Point(10, 10));
            list.Add(new Line(1, 1, 10, 10));
            list.Add(new Rectangle(10, 10, 100, 100));
            foreach(Diagram diagram in list)
            {
                Console.WriteLine("<{0}>", diagram.ID);
                diagram.Draw();
            }
        }
    }
}

실행화면

반응형