비주얼 베이직 .NET에서 상속은 Inherits 키워드를 사용하여 구현됩니다. 이는 공통 및 재정의 가능한 메서드와 속성을 구현하는 클래스 계층을 생성할 수 있게 합니다.
다형성을 지원하기 위해 기본 클래스의 메서드는 Overridable 수식어로 선언되고, 파생 클래스에서는 Overrides를 사용하여 재정의됩니다. 추가 재정의를 방지하기 위해 NotOverridable 수식어가 사용됩니다.
예:
' 가상 메서드를 가진 기본 클래스 Animal Public Class Animal Public Overridable Sub Speak() Console.WriteLine("동물이 소리를 낸다.") End Sub End Class ' 자식 클래스 Dog는 Speak를 재정의함 Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("개가 짖는다.") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' 출력: 개가 짖는다. End Sub
Q: 비주얼 베이직 .NET에서 기본 클래스에서 Overridable/Abstract로 선언되지 않은 메서드를 재정의할 수 있습니까?
A: 아니요. Overridable로 표시된 메서드 또는 인터페이스/추상화로 선언된 메서드만 상속 시 재정의할 수 있습니다. 일반 메서드에 대해 Overrides를 사용하면 컴파일 오류가 발생합니다.
' 오류: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' 컴파일 오류 End Sub End Class
이야기
1. 실제 프로젝트에서 마이크로서비스 아키텍처와 관련하여 새로운 팀원이 기본 컨트롤러 클래스에서 가상 메서드를 일반 메서드(Overridable 없이)로 선언했습니다. 이후 다른 개발자가 이 메서드를 특별한 처리로 재정의하려고 시도했으나, 부모 구현이 항상 호출되어 중복 로직과 버그가 발생했습니다.
이야기
2. 아키텍처의 부족한 설계와 다형성의 부재로 인해 수백 줄의 중복 코드가 생겼습니다: 새로운 상속자를 추가해야 할 경우 기본 클래스 메서드의 대부분을 재작성해야 했고, 단지 필요한 Override만 구현하면 되지 않았습니다. 이는 유지보수와 지원을 복잡하게 만들었습니다.
이야기
3. 기업 애플리케이션의 경우: .NET Core로 이전하는 과정에서 개발자가 메서드를 Overridable로 표시했으나 인터페이스의 Implements를 추가하는 것을 실수했습니다. 그 결과 상속 계층에서 메서드의 모호성이 발생했고, 인터페이스를 통한 호출에 문제가 생겨 기능이 작동하지 않게 되었습니다.