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

[C#] 상속과 다형성 - 상품, 할인상품

언제나휴일 2019. 8. 8. 15:42
반응형

실습) 다음 내용에 맞게 형식을 정의하시오.

상품
상품 이름과 가격을 멤버 필드로 갖습니다.
생성할 때 이름과 가격을 입력 인자로 받습니다.
가격과 이름의 접근자를 제공하며 가격 접근자는 가상 메서드입니다.
상품 정보를 출력하는 가상 메서드를 제공합니다.
형식 내부에서만 접근 가능한 가격 설정자와 이름 설정자가 있습니다.
 

할인 상품
할인율을 멤버 필드로 갖습니다.
상품 이름과 가격, 할인율을 입력 인자로 받습니다.
가격 접근자와 상품 정보 출력하는 메서드를 재정의합니다.
할인율의 접근자 메서드를 제공합니다.
형식 내부에서만 접근할 수 있는 할인율 설장자가 있습니다.

*2019년 공주대에서

설계 도면 예

Product.cs

using System;

namespace 상품과_할인_상품
{
    class Product
    {
        /* 속성 get 블럭에서 멤버 필드 값을 반환하고
         * 속성 set 블럭에서 멤버 필드 값을 설정하며
         * 이 외에 다른 행위가 없다면 자동 속성으로 정의할 수 있다.*/
        #region 이름을 멤버 필드와 멤버 속성으로 표현
        //string name;//상품 이름
        //public string Name
        //{
        //    get
        //    {
        //        return name;
        //    }
        //    private set
        //    {
        //        name = value;
        //    }
        //}
        #endregion
        public string Name
        {
            get;
            private set;
        }
        #region 상품 가격을 멤버 필드와 멤버 속성으로 표현
        //int price;//상품 가격
        //public int Price
        //{
        //    get
        //    {
        //        return price;
        //    }
        //    private set
        //    {
        //        price = value;
        //    }
        //}
        #endregion

        public int Price
        {
            get;
            private set;
        }
        public Product(string name,int price)
        {
            Name = name;
            Price = price;
        }
        public override string ToString()
        {
            return Name;
        }
        //GetSalePrice처럼 명명하여 혼돈을 피하면 더 좋은 코드라고 생각함
        public virtual int GetPrice()
        {
            return Price;
        }
    }
}

DiscountProduct.cs

namespace 상품과_할인_상품
{
    class DiscountProduct:Product
    {        
        public int Discount
        {
            get;
            private set;
        }
        public DiscountProduct(string name, int price,int discount):base(name,price)
        {
            Discount = discount;
        }
        public override string ToString()
        {
            return string.Format("할인 상품 ")+base.ToString();
        }
        public override int GetPrice()
        {
            return Price * (100 - Discount) / 100;            
        }
    }
}

Program.cs

using System;

namespace 상품과_할인_상품
{
    class Program
    {
        static void Main(string[] args)
        {
            Product[] proes = new Product[2];
            proes[0] = new Product("지우개", 1000);
            proes[1] = new DiscountProduct("지울까",1000,30);
            Console.WriteLine(proes[0]);
            Console.WriteLine(proes[1]);

            Console.WriteLine(proes[0].Price);
            Console.WriteLine(proes[1].Price);

            Console.WriteLine(proes[0].GetPrice());
            Console.WriteLine(proes[1].GetPrice());

            ViewDiscountInfo(proes[0] as DiscountProduct);
            ViewDiscountInfo(proes[1] as DiscountProduct);
        }

        private static void ViewDiscountInfo(DiscountProduct dp)
        {
            if(dp != null)
            {
                Console.WriteLine("{0} 할인율:{1}",dp, dp.Discount);
            }
        }
    }
}

실행화면

반응형