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 |