0317 인터페이스/Virtual

2021. 3. 17. 14:29C#/수업내용

관련 기능 그룹에 대한 정의>>만<< 포함되어 있다.

여러 소스의 동작을 클래스에 포함할 수 있다.

> 클래스에서 여러 상속을 지원하지 않기 때문에

> 구조체는 다른 구조체를 상속할 수 없기 때문에

 

interface I인터페이스 이름(형용사)<T>

{  bool 인터페이스(T obj);  }

 

인터페이스에서 상속받은 클래스는 반드시 메서드를 구현해야하고, 클래스에서는 메서드를 사용할 수 있다.

 

직접 인터페이스 인스턴스화 할 수 없다. (new (); 사용 불가)

클래스는 여러 인터페이스를 구현할 수 있다.

클래스는 기본 클래스를 상속할 수 있고, 하나 이상의 인터페이스를 제공할 수 있다.

 

 

 

Virtual

파생 클래스에서 재정의할 수 있다. (더 구체적으로)

Override 메서드를 확장하거나 수정

virtual을 부모 클래스에서 쓰고 자식 클래스에서 override

 

 

public class ZergUnit
    {
        public ZergUnit() 
        {
            Console.WriteLine("저그 유닛 생성자");
        }
        public virtual void Attack() 
        {
            Console.WriteLine("공격 했습니다.");
        }
    }
interface IBurrow
    {
        void Burrow();
    }
public class Lurker :ZergUnit,IBurrow
    {
        public Lurker() 
        {
            Console.WriteLine("Lucker 생성자");
        }

        public override void Attack()
        {
            Console.WriteLine("가시로 공격했습니다.");
        }
        public void Burrow()
        {
            Console.WriteLine("럴커가 버로우 했습니다.");
        }
    }
public class Ultralisk : ZergUnit
    {
        public Ultralisk() 
        {
            Console.WriteLine("울트라리스크가 생성 되었습니다.");
        }
        public override void Attack()
        {
            Console.WriteLine("뿔로 공격했습니다.");
        }
    }
public App() 
        {
            Lurker lurker = new Lurker();
            lurker.Burrow();
            lurker.Attack();

            Ultralisk ultralisk = new Ultralisk();
            ultralisk.Attack();
        }

 

 

 

public class TerranUnit
    {
        public TerranUnit() 
        {
            Console.WriteLine("테란 유닛 생성자");
        }
        public virtual void Attack() 
        {
            Console.WriteLine("공격 했습니다.");
        }
    }
interface ITransparent
    {
        void MakeTransparent();
    }
public class Valkyrie:TerranUnit
    {
        public Valkyrie() 
        {
            Console.WriteLine("발키리 생성자");
        }
        public override void Attack()
        {
            Console.WriteLine("미사일로 공격합니다.");
        }
    }
public class Wraith :TerranUnit,ITransparent
    {
        public Wraith() 
        {
            Console.WriteLine("레이스 생성자");
        }
        public override void Attack()
        {
            Console.WriteLine("레이저로 공격합니다.");
        }

        public void MakeTransparent()
        {
            Console.WriteLine("레이스가 클로킹 했습니다.");
        }
    }
public class App
    {
        public App() 
        {
            Valkyrie valkyrie = new Valkyrie();
            valkyrie.Attack();

            Wraith wraith = new Wraith();
            wraith.Attack();
            wraith.MakeTransparent();
        }
    }

 

 

 

public class ProtossUnit
    {
        public ProtossUnit() 
        {
            Console.WriteLine("프로토스 유닛 생성자");
        }
        public void Move() 
        {
            Console.WriteLine("이동합니다.");
        }
    }
interface ITransparent
    {
        void MakeTransparent();
    }
interface IFly
    {
        void Fly();
    }
public class Zealot:ProtossUnit
    {
        public Zealot() 
        {
            Console.WriteLine("질럿 생성자");
        }
    }
public class Observer:ProtossUnit,ITransparent,IFly
    {
        public Observer() 
        {
            Console.WriteLine("옵져버 생성자");
        }

        public void Fly()
        {
            Console.WriteLine("옵져버는 공중 유닛");
        }

        public void MakeTransparent()
        {
            Console.WriteLine("옵져버가 클로킹 합니다.");
        }
    }
public class DarkTemplar:ProtossUnit,ITransparent
    {
        public DarkTemplar() 
        {
            Console.WriteLine("다크템플러 생성자");
        }
        public void MakeTransparent()
        {
            Console.WriteLine("다크템플러가 클로킹 합니다.");
        }
    }
public class App
    {
        public App() 
        {
            Zealot zealot = new Zealot();
            zealot.Move();

            Observer observer = new Observer();
            observer.Fly();
            observer.MakeTransparent();

            DarkTemplar darkTemplar = new DarkTemplar();
            darkTemplar.Move();
            darkTemplar.MakeTransparent();
        }
    }

 

 

public class Cookie
    {
        public Cookie() 
        {
            Console.WriteLine("쿠키 생성자");
        }
        public void Run() 
        {
            Console.WriteLine("쿠키가 달립니다.");        
        }
    }
interface IDefense
    {
        void Defense();
    }
interface IAttack
    {
        void Attack();
    }
interface IHeal
    {
        void Heal();
    }
public class HerbCookie:Cookie,IHeal
    {
        public HerbCookie() 
        {
            Console.WriteLine("허브맛 쿠키 생성자");
        }
        public void Heal() 
        {
            Console.WriteLine("힐링용 쿠키");
        }
    }
public class EspressoCookie:Cookie,IAttack
    {
        public EspressoCookie() 
        {
            Console.WriteLine("에스프레소맛 쿠키 생성자");
        }
        public void Attack() 
        {
            Console.WriteLine("공격형 쿠키");
        }
    }
 public class MilkCookie:Cookie,IDefense
    {
        public MilkCookie() 
        {
            Console.WriteLine("우유맛 쿠키 생성자");
        }
        public void Defense() 
        {
            Console.WriteLine("방어형 쿠키");
        }
    }
public class App
    {
        public App() 
        {
            HerbCookie herbCookie = new HerbCookie();
            herbCookie.Run();
            herbCookie.Heal();
            Console.WriteLine();

            EspressoCookie espressoCookie = new EspressoCookie();
            espressoCookie.Run();
            espressoCookie.Attack();
            Console.WriteLine();

            MilkCookie milkCookie = new MilkCookie();
            milkCookie.Run();
            milkCookie.Defense();
        }
    }

 

 

 

'C# > 수업내용' 카테고리의 다른 글

0317 Property 속성/Stack 클래스/Queue 큐  (0) 2021.03.17
0317 Abstract  (0) 2021.03.17
0317 배열 복습★★★★  (0) 2021.03.17
0316 Collection> Dictionary  (0) 2021.03.16
0316 ArrayList/제너릭 클래스  (0) 2021.03.16