다음을 통해 공유


상속(F#)

상속은 개체 지향 프로그래밍에서 "동등" 관계, 즉 하위 형식을 모델링하는 데 사용됩니다.

상속 관계 지정

상속 관계를 지정하려면 클래스 선언에 inherit 키워드를 사용합니다. 다음 예제에서는 기본 구문 형식을 보여 줍니다.

type MyDerived(...) =
   inherit MyBase(...)

클래스에는 직접 기본 클래스가 최대 한 개까지만 포함될 수 있습니다. inherit 키워드를 사용하여 기본 클래스를 지정하지 않으면 클래스가 Object에서 암시적으로 상속됩니다.

상속된 멤버

클래스가 다른 클래스에서 상속되는 경우 파생된 클래스를 사용할 때 기본 클래스의 메서드와 멤버를 마치 파생된 클래스에 직접 속한 멤버인 것처럼 사용할 수 있습니다.

모든 let 바인딩과 생성자 매개 변수는 클래스 전용이므로 파생 클래스에서 액세스할 수 없습니다.

키워드 base를 파생 클래스에 사용하여 기본 클래스 인스턴스를 참조할 수 있습니다. 이는 자체 식별자처럼 사용됩니다.

가상 메서드 및 재정의

F#에서 가상 메서드와 속성이 작동하는 방식이 기타 .NET 언어와 다른 경우가 있습니다. 새 가상 멤버를 선언하려면 abstract 키워드를 사용합니다. 해당 메서드에 대한 기본 구현을 제공하는지 여부와 상관없이 이를 선언할 수 있습니다. 따라서 기본 클래스에서의 가상 메서드에 대한 완전한 정의는 다음과 같은 패턴을 따릅니다.

abstract member method-name : type

default self-identifier.method-name argument-list = method-body

파생 클래스에서 이 가상 메서드에 대한 재정의는 다음과 같은 패턴을 따릅니다.

override self-identifier.method-name argument-list = method-body

기본 클래스에서 기본 구현을 생략하면 기본 클래스가 추상 클래스 역할을 합니다.

다음 코드 예제에서는 기본 클래스에 새 가상 메서드 function1을 선언하고 파생 클래스에서 이를 재정의하는 방법을 보여 줍니다.

type MyClassBase1() =
   let mutable z = 0
   abstract member function1 : int -> int
   default u.function1(a : int) = z <- z + a; z

type MyClassDerived1() =
   inherit MyClassBase1()
   override u.function1(a: int) = a + 1

생성자 및 상속

기본 클래스의 생성자를 파생 클래스에서 호출해야 합니다. 기본 클래스 생성자의 인수는 inherit 절의 인수 목록에 표시됩니다. 사용되는 값은 파생 클래스 생성자에 제공되는 인수를 통해 결정해야 합니다.

다음 코드에는 기본 클래스와 파생 클래스가 나와 있습니다. 여기서 파생 클래스는 inherit 절을 통해 기본 클래스 생성자를 호출합니다.

type MyClassBase2(x: int) =
   let mutable z = x * x
   do for i in 1..z do printf "%d " i


type MyClassDerived2(y: int) =
   inherit MyClassBase2(y * 2)
   do for i in 1..y do printf "%d " i

생성자가 여러 개인 경우 다음 코드를 사용할 수 있습니다. 파생된 클래스 생성자의 첫 번째 줄은 inherit 절이고 해당 필드는 val 키워드에서 선언되는 명시적 필드로 나타납니다. 자세한 내용은 명시적 필드: val 키워드를 참조하십시오.

type BaseClass =
    val string1 : string
    new (str) = { string1 = str }
    new () = { string1 = "" }

type DerivedClass =
    inherit BaseClass
    val string2 : string
    new (str1, str2) = { inherit BaseClass(str1); string2 = str2 }
    new (str2) = { inherit BaseClass(); string2 = str2 }

let obj1 = DerivedClass("A", "B")
let obj2 = DerivedClass("A")

상속을 대신하는 방법

형식을 약간만 수정하면 되는 경우 상속 대신 개체 식을 사용하는 것도 좋은 방법이 될 수 있습니다. 다음 예제에서는 새 파생 형식을 만드는 대신 개체 식을 사용하는 방법을 보여 줍니다.

open System

let object1 = { new Object() with 
      override this.ToString() = "This overrides object.ToString()"
      }

printfn "%s" (object1.ToString())

개체 식에 대한 자세한 내용은 개체 식(F#)을 참조하십시오.

개체 계층 구조를 만들 때는 상속 대신 구별된 공용 구조체를 사용하는 것이 좋습니다. 구별된 공용 구조체를 사용하면 공통적인 전체 형식을 공유하는 각 개체에 대해 서로 다른 동작을 모델링할 수도 있습니다. 대개의 경우 서로 조금씩만 차이가 나는 여러 개의 파생 클래스를 사용하는 대신 구별 공용 구조체 하나로 원하는 결과를 얻을 수 있습니다. 구별된 공용 구조체에 대한 자세한 내용은 Discriminated Unions(F#)를 참조하십시오.

참고 항목

참조

개체 식(F#)

기타 리소스

F# 언어 참조