방프리
23.05.20 Chapter2. API 설계 (Item 15) 본문
Item 15 : 인터페이스 메서드와 가상 메서드의 차이를 이해하라
인터페이스와 가상 함수를 재정의하는 건 확실히 다르다. 가상 함수는 필수적으로 구현해주어야 하지만
인터페이스 함수는 그렇지 않기 때문이다.
각각의 방식을 사용한 코드는 다음과 같다.
//인터페이스
interface IMessage
{
void Message();
}
public class MyClass : IMessage
{
public void Message() => WriteLine(nameof(MyClass));
}
public class MyDerivedClass : MyClass
{
public new void Message() => WriteLine(nameof(MyDerivedClass));
// 해당 함수는 가상함수가 아니므로 new 연산자를 통해 재정의 해주어야 한다.
}
//베이스 클래스에 접근이 안될 때
public class MyClass : IMessage
{
private void Message() => WriteLine(nameof(MyClass));
}
public class MyDerivedClass : MyClass, IMessage
{
public new void Message() => WriteLine(nameof(MyDerivedClass));
// 해당 함수는 가상함수가 아니므로 new 연산자를 통해 재정의 해주어야 한다.
}
//가상 함수
public class MyClass : IMessage
{
public virtual void Message() => WriteLine(nameof(MyClass));
}
public class MyDerivedClass : MyClass, IMessage
{
public override void Message() => WriteLine(nameof(MyDerivedClass));
}
//순수 가상 함수
public abstract class MyClass : IMessage
{
public abstract void Message();
}
public class MyDerivedClass : MyClass
{
public override void Message() => WriteLine(nameof(MyDerivedClass));
}
//실제 구현 함수와 호출 함수를 분리
public class MyClass : IMessage
{
protected virtual void OnMessage()
{
}
public void Message()
{
OnMessage();
}
}
각각 구현하는 방법은 상황, 목적 그리고 어떻게 관리할 것인가에 따라 채택하면 좋을 듯 싶다.
개인적인 생각이지만 순수관리목적이라면 인터페이스가 가상함수보다 좀 더 매력적이지 않을까 싶다.
'C# > More Effective C#' 카테고리의 다른 글
23.06.08 Chapter2. API 설계 (Item 17) (0) | 2023.06.08 |
---|---|
23.05.20 Chapter2. API 설계 (Item 16) (0) | 2023.06.04 |
23.01.30 Chapter2. API 설계 (Item 14) (0) | 2023.02.05 |
23.01.30 Chapter2. API 설계 (Item 13) (0) | 2023.01.30 |
23.01.25 Chapter2. API 설계 (Item 12) (0) | 2023.01.26 |
Comments