C# 인터페이스, 추상 클래스, 프로퍼티

728x90
  • 인터페이스

- 메소드, 이벤트, 인덱서, 프로퍼티, 필드 불가

- 구현부 없음(정의)

- 인스턴스 생성 불가(참조 가능)

- 다중 상속 시 인터페이스는 좋은 대안

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _089_Interface
{
    interface IAA
    {
        //public int a;  //에러(필드 불가)
        //private void IPrint() { }  //에러(private)
        //public void IPrint();  //에러(public)
        int A { get; set; } //프로퍼티 가능
        void IAAPrint();
    }
    interface IBB
    {
        void IBBPrint();
    }
    class Super
    {
        protected int num;
        public virtual void Print()
        {
            Console.WriteLine("==================================================");
        }
    }
    class AA : IAA
    {
        public int A { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public void IAAPrint() //무조건 선언해주어야 한다
        {
            Console.WriteLine("class AA interface IAA에 IAAPrint() 재정의");
        }
    }
    class BB : IAA, IBB
    {
        public int A
        {
            get { return A; }
            set { A = value; }
        }
        public void IAAPrint()
        {
            Console.WriteLine("class BB interface IAA에 IAAPrint() 재정의");
        }
        public void IBBPrint()
        {
            Console.WriteLine("class BB interfaece IBBdp IBBPrint() 재정의");
        }
    }
    class CC : Super, IAA, IBB
    {
        public int A
        {
            get { return A; }
            set { A = value; }
        }
        public override void Print()
        {
            base.Print();
            Console.WriteLine("class super => Print() 재정의");
        }
        public void IAAPrint()
        {
            Console.WriteLine("class cc => interface IAA에 IAAPrint() 재정의");
        }
        public void IBBPrint()
        {
            Console.WriteLine("class cc interface IBB에 IBBPrint() 재정의");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();
            aa.IAAPrint();

            BB bb = new BB();
            bb.IAAPrint();
            bb.IBBPrint();

            IAA Iaa = new AA();  //참조 가능
            Iaa.IAAPrint();

            IBB Ibb = bb as IBB;
            Ibb.IBBPrint();

            CC cc = new CC();
            cc.Print();
            cc.IAAPrint();
            cc.IBBPrint();

            Super sCC = cc as Super;
            sCC.Print();

            IAA IAAcc = cc as IAA;
            IAAcc.IAAPrint();

            IBB IBBcc = cc as IBB;
            IBBcc.IBBPrint();
        }
    }
}

  • 추상 클래스

- 인스턴스 생성 불가(참조 가능)

- 구현부 없음

- 상속 받는 클래스의 규격

- abstract는 무조건 override 해야함(virtual은 override 안해도 됨)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

abstract class abstractAA
{
    protected int num;
    public abstractAA(int num)
    {
        this.num = num;
    }
    public abstract void abstractPrint(); //강제적으로 상속받은 클래스에서 구현부를 정의

    public virtual void virtualPrint()
    {
        Console.WriteLine("abstractAA virtual void virtualPrint()");
    }
    public void Print()
    {
        Console.WriteLine("abstractAA Print()");
    }
}
class AA : abstractAA
{
    public AA(int num) : base(num)
    {
        Console.WriteLine("num : {0}", num);
    }
    public override void abstractPrint()
    {
        Console.WriteLine("AA override void abstractPrint()");
    }
    public override void virtualPrint()
    {
        base.virtualPrint();
        Console.WriteLine("AA override void virtualPrint()");
    }
}
namespace _090_abstract
{
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA(10);
            aa.abstractPrint();
            aa.virtualPrint();
            aa.Print();

            //abstractAA aaa = new abstractAA(10);  //불가
        }
    }
}

 

  • 프로퍼티

- set, get 키워드

- 정보 은닉

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _091_property01
{
    class AA
    {
        private int num;

        public int NUM
        {
            get { return num; }
            set { num = value; } //set부분을 구현하지 않으면 readonly와 같은 읽기 전용
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();
            aa.NUM = 100; //set

            Console.WriteLine("aa.Num : {0}", aa.NUM); //get
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _092_Property02
{
    class AA
    {
        private int num;
        private string name;

        public int NUM { get; set; }
        public string NAME { get; set; } = "NoName";
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();
            Console.WriteLine("aa.num : {0}", aa.NUM);
            Console.WriteLine("aa.NAME : {0}", aa.NAME);

            aa.NUM = 100;
            Console.WriteLine("aa.num : {0}", aa.NUM);
            aa.NAME = "JACK";
            Console.WriteLine("aa.NAME : {0}", aa.NAME);
        }
    }
}

728x90

'게임 프로그래밍 > C#' 카테고리의 다른 글

C# 컬렉션(ArrayList,Queue,Stack,Hashtable)  (0) 2021.12.20
C# RPG게임 예제 코드  (0) 2021.12.20
C# 클래스 다형성  (0) 2021.12.19
C# 클래스 상속, is/as 키워드  (0) 2021.12.16
C# 클래스 static & this  (0) 2021.12.15