728x90
의무 부여 : abstract
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//의무 부여 : 추상 클래스 편 (= 존재 X)
//특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
abstract class Monster
{
//의무 부여 : 추상 함수 편 (= 존재 X)
//특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
//특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
public abstract void Shout(); //몬스터라면 무조건 샤우팅 하는 기능
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
static void Main(string[] args)
{
//추상 클래스 특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
Monster monster = new Monster(); //오류
//이처럼, 추상인 것(= 존재X)를 사용한다는 것은 말이 안된다.
}
}
}
클래스의 한계 - 다중 상속 불가능 (클래스를 2개 이상 쓰면 오류가 뜬다)
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//의무 부여 : 추상 클래스 편 (= 존재 X)
//특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
abstract class Monster
{
//의무 부여 : 추상 함수 편 (= 존재 X)
//특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
//특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
public abstract void Shout(); //몬스터라면 무조건 샤우팅 하는 기능
}
//하늘을 나는 기능
abstract class Flyable
{
public abstract void Fly();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
//다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
//죽음의 다이아몬드 문제
class FlyableOrc : Orc, Flyable //Flyable에 빨간줄
{
}
static void Main(string[] args)
{
}
}
}
클래스의 한계 - 다중 상속 불가능 (클래스를 2개 이상 쓰면 오류가 뜬다)
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//의무 부여 : 추상 클래스 편 (= 존재 X)
//특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
abstract class Monster
{
//의무 부여 : 추상 함수 편 (= 존재 X)
//특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
//특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
public abstract void Shout(); //몬스터라면 무조건 샤우팅 하는 기능
}
//하늘을 나는 기능
abstract class Flyable
{
public abstract void Fly();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
class SkeletonOrc : Orc, Skeleton
{
//SkeletonOrc 가 만약에 Shout()함수를 호출하면, 부모클래스 Orc에 호출하는지, 부모클래스 Skeleton에 호출하는지 알 수가 없다.
//이렇게 구조가 완전 꼬이게 된다 -> 그러므로 C# 에서는 이 문법을 막아놓음.
}
static void Main(string[] args)
{
}
}
}
다중상속을 하는 방법 : Interface
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//의무 부여 : 추상 클래스 편 (= 존재 X)
//특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
abstract class Monster
{
//의무 부여 : 추상 함수 편 (= 존재 X)
//특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
//특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
public abstract void Shout(); //몬스터라면 무조건 샤우팅 하는 기능
}
//다중 상속 해결법 - Interface
//interface 클래스 편
//특징 1 : public이나 class 다 날리고 interface만 쓴다
//특징 2 : 클래스명 앞에 I를 꼭 붙인다.
interface IFlyable //하늘을 나는 기능
{
//interface 함수 편
//특징 1 : public이나 abstract 없애고 자료형과 이름만 표현
void Fly();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
//다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
//죽음의 다이아몬드 문제
class FlyableOrc : Orc, IFlyable
{
//interface를 부모로 받은 경우, interface 안에 있는 함수를 무조건 사용해야 빨간줄이 뜨지 않는다.
public void Fly()
{
}
}
static void Main(string[] args)
{
}
}
}
interface로 인스턴스화 가능
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//의무 부여 : 추상 클래스 편 (= 존재 X)
//특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
abstract class Monster
{
//의무 부여 : 추상 함수 편 (= 존재 X)
//특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
//특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
public abstract void Shout(); //몬스터라면 무조건 샤우팅 하는 기능
}
//다중 상속 해결법 - Interface
//interface 클래스 편
//특징 1 : public이나 class 다 날리고 interface만 쓴다
//특징 2 : 클래스명 앞에 I를 꼭 붙인다.
//특징 3 : 인스턴스화가 가능하다.
interface IFlyable //하늘을 나는 기능
{
//interface 함수 편
//특징 1 : public이나 abstract 없애고 자료형과 이름만 표현
void Fly();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
//다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
//죽음의 다이아몬드 문제
class FlyableOrc : Orc, IFlyable
{
//interface를 부모로 받은 경우, interface 안에 있는 함수를 무조건 사용해야 빨간줄이 뜨지 않는다.
public void Fly()
{
}
}
static void DoFly(IFlyable flyable)
{
//interface로 만든 함수를 사용
flyable.Fly();
}
static void Main(string[] args)
{
//interface의 경우, 인스턴스화 가능
IFlyable flyable = new FlyableOrc();
DoFly(flyable);
}
}
}
728x90
'● > 섹션 7. 유용한 문법' 카테고리의 다른 글
06.Lambda(람다) (0) | 2021.07.14 |
---|---|
05.event(이벤트) (0) | 2021.07.14 |
04.델리게이트(delegate) (0) | 2021.07.14 |
03.프로퍼티 (0) | 2021.07.14 |
01.Generic 일반화 (0) | 2021.07.13 |