오버라이딩과 다형성
- 객체지향 프로그래밍에서 객체는 여러 형태를 가질 수 있음
- 하위 형식 다형성 subtype polymorphism
- 부모클래스에서 자식클래스를 통해 다형성 실현 가능
- 메소드를 오버라이딩하기 위해서는
- 조건 : 오버라이딩할 메소드는 virtual 키워드로 한정
- private로 선언한 메소드는 오버라이딩할 수 없음
- 예시 코드
using System;
namespace Overriding
{
class ArmorSuite
{
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
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");
}
}
class MainApp
{
static void Main(string[] args)
{
Console.WriteLine("Creating ArmorSuite...");
ArmorSuite armorsuite = new ArmorSuite();
armorsuite.Initialize();
Console.WriteLine("\nCreating IronMan...");
ArmorSuite ironman = new IronMan();
ironman.Initialize();
Console.WriteLine("\nCreating WarMaching...");
ArmorSuite warmachine = new WarMachine();
warmachine.Initialize();
}
}
}
오버라이딩 봉인
- 클래스를 상속이 안 되도록 봉인하는 것처럼 메소드도 오버라이딩 안되도록 sealed키워드를 이용하여 봉인
- virtual로 된 가상 메소드를 오버라이딩한 버전의 메소드만 봉인 가능
using System;
class Base
{
public virtual void SealMe()
{
}
}
class Derived : Base
{
public sealed override void SealMe()
{
}
}
class WantToOverride : Derived
{
public override void SealMe()
{
}
}
class MainApp
{
static void Main(string[] args)
{
}
}
- 봉인 메소드는 자식 클래스 작성자를 위한 부모 클래스 작성자의 배려
- 자식 클래스 작성자는 자신이 작성한 코드만으로 객체가 원하는대로 동작하지 않는 원인을 알 수 없는 경우가 많음
확장 메소드
- 기존 클래스의 기능을 확장하는 기법
- 부모 클래스를 물려받은 자식 클래스에서 필드, 메소드를 추가하는 상속과는 다름
- 확장 메소드를 이용하면 string 클래스에 문자열 뒤집는 기능도 추가 가능
- 확장 메소드를 선언하되, static 한정자로 수식
- 첫번째 매개변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스의 인스턴스여야 함
- 형식
namespace 네임스페이스이름
{
public static class 클래스이름
{
public static 변환_형식 메소드 이름 (this 대상형식 식별자, 매개변수_목록)
{
}
}
}
using System;
using MyExtension;
namespace MyExtension
{
public static class IntegerExtension
{
public static int Square(this int myInt)
{
return myInt * myInt;
}
public static int Power(this int myInt, int exponent)
{
int result = myInt;
for (int i = 1; i < exponent; i++)
result = result * myInt;
return result;
}
}
}
namespace ExtensionMethod
{
class MainApp
{
static void Main(string[] args)
{
Console.WriteLine($"{3}^2 : {3.Square()}");
Console.WriteLine($"{3}^{4} : {3.Power(4)}");
Console.WriteLine($"{2}^{10} : {2.Power(10)}");
}
}
}