일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 배열초기화
- c#
- 접근 한정자
- 인덱서
- 형식변환
- 메소드숨기기
- is
- 가변배열
- 배열
- 프로퍼티
- 튜플
- as
- 분할 클래스
- this 키워드
- 인터페이스의 프로퍼티
- base()
- System.Array
- 인터페이스 상속
- 일반화 클래스
- 자동구현프로퍼티
- 클래스
- 클래스 연습문제
- 오버라이딩
- 인터페이스 예제
- 추상 프로퍼티
- 프로퍼티와 생성자
- 무명형식
- 이것이C#이다
- 중첩클래스
- 컬렉션 초기화
- Today
- Total
제로의영역
7.10 오버라이딩과 다형성 본문
* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.
* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.
(1) 다형성의 정의: 객체(데이터와 메소드)가 여러 형태를 가지는 것.
(2) 용도: 부모 클래스의 객체를 활용하면서 추가적으로 새로운 객체로 활용하기 위해서 사용.
(3) 사용법
1) 오버라이딩(재정의) 해줌: 오버로딩(하나의 메소드 이름에 여러 개의 구현을 올리는 것)과 헷갈리네요.
2) 오버라이딩을 할 메소드를 virtual 키워드로 한정 해줌
// 헉! 메소드는 '한정자+반환형식+메소드 이름(매개변수목록)'만 있는 줄 알았는데 이렇게 되면 '한정자+한정자
(vtirtual)+반환형식+메소드이름(매개변수목록)'이 됨. 길어졌다. ㅜㅜ 젠장!
class ArmorSuite
{
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
위의 코드로 ArmorSuite를 개발. (추후 업그레이드 가능성을 위해 virtual 키워드로 한정해줌)
3) 오버라이딩을 하는 측에서는 부모 클래스에 선언되어 있던 메소드를 재정의하고 있음을 컴파일러에게 알려야 하므
로 override로 한정해줘야 함.
* private(내부에서만 접근이 가능하고 파생클래스에서는 접근이 불가능한 한정자)으로 선언한 메소드는 오버라이딩 할 수 없음.
class IronMan:ArmorSuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Repulsor Rays Armed");
}
}
class WarMachine:ArmorSuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Double-Barrel Cannons Armed");
Console.WriteLine("Micro-Rocket Launcher Armed");
}
}
IronMan과 WarMachine은 override로 한정된 메소드를 통해 부모클래스 ArmorSuite의 virtual로 한정된 메소드를 재정의하여 사용하여 각각의 용도에 맞는 ArmorSuite로 사용함.
예제)
using System;
namespace ex7_11
{
class ArmorSuite
{
public virtual void Initialize() //응용이 되는 메소드: virtual을 보고 파악
{
Console.WriteLine("Armored");
}
}
class IronMan:ArmorSuite //ArmorSuite를 상속받은 자식클래스
{
public override void Initialize() //virtual로 한정된 메소드를 변형하는 메소드override를 보고 파악
{
base.Initialize(); // 부모클래스(ArmorSuite)의 Initialize()호출
Console.WriteLine("Repulsor Rays Armed");
}
}
class WarMachine:ArmorSuite //ArmorSuite를 상속받은 자식클래스
{
public override void Initialize() //virtual로 한정된 메소드를 변형하는 메소드override를 보고 파악
{
base.Initialize(); // 부모클래스(ArmorSuite)의 Initialize()호출
Console.WriteLine("Double-Barrel Cannons Armed");
Console.WriteLine("Micro-Rocket Lanucher Armed");
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Creating ArmorSuite...");
ArmorSuite armorsuite = new ArmorSuite(); //armorsuite 생성
armorsuite.Initialize(); //ArmorSuite클래스의 Initialize() 호출
Console.WriteLine("\nCreating IronMan...");
ArmorSuite ironman = new IronMan(); //ironman 생성
ironman.Initialize(); //IronMan클래스의 Initialize()호출
Console.WriteLine("\nCreatin WarMachine...");
ArmorSuite warmachine = new WarMachine(); //warmachine 생성
warmachine.Initialize(); //WarMachine클래스의 Initialize()호출
}
}
}
출력 결과:
Creating ArmorSuite...
Armored
Creating IronMan...
Armored
Repulsor Rays Armed
Creatin WarMachine...
Armored
Double-Barrel Cannons Armed
Micro-Rocket Lanucher Armed
'C#' 카테고리의 다른 글
7.12 오버라이딩 봉인하기 (0) | 2019.06.05 |
---|---|
7.11 메소드 숨기기 (0) | 2019.06.05 |
7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 2. (0) | 2019.05.31 |
7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 1. (0) | 2019.05.30 |
7.8 상속으로 코드 재활용하기(base키워드) (0) | 2019.05.29 |