メソッドMethods

メソッドは、型に関連付けられている関数です。A method is a function that is associated with a type. オブジェクト指向プログラミングでは、メソッドを使用して、オブジェクトと型の機能および動作を公開および実装します。In object-oriented programming, methods are used to expose and implement the functionality and behavior of objects and types.

構文Syntax

// Instance method definition.
[ attributes ]
member [inline] self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Static method definition.
[ attributes ]
static member [inline] method-name parameter-list [ : return-type ] =
    method-body

// Abstract method declaration or virtual dispatch slot.
[ attributes ]
abstract member method-name : type-signature

// Virtual method declaration and default implementation.
[ attributes ]
abstract member method-name : type-signature
[ attributes ]
default self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Override of inherited virtual method.
[ attributes ]
override self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Optional and DefaultParameterValue attributes on input parameters
[ attributes ]
[ modifier ] member [inline] self-identifier.method-name ([<Optional; DefaultParameterValue( default-value )>] input) [ : return-type ]

RemarksRemarks

前の構文では、さまざまな形式のメソッド宣言と定義を確認できます。In the previous syntax, you can see the various forms of method declarations and definitions. メソッド本体が長い場合、改行は等号 (=) に従い、メソッド本体全体がインデントされます。In longer method bodies, a line break follows the equal sign (=), and the whole method body is indented.

属性は、任意のメソッド宣言に適用できます。Attributes can be applied to any method declaration. これらは、メソッド定義の構文の前にあり、通常は別の行に表示されます。They precede the syntax for a method definition and are usually listed on a separate line. 詳細については、「属性」を参照してください。For more information, see Attributes.

メソッドはとしinlineてマークできます。Methods can be marked inline. inline の詳細については、「Inline Functions」(インライン関数) を参照してください。For information about inline, see Inline Functions.

非インラインメソッドは、型の中で再帰的に使用できます。recキーワードを明示的に使用する必要はありません。Non-inline methods can be used recursively within the type; there is no need to explicitly use the rec keyword.

インスタンスメソッドInstance Methods

インスタンスメソッドは、 memberキーワードと自己識別子を使用し、その後にピリオド (.) とメソッド名とパラメーターを指定して宣言します。Instance methods are declared with the member keyword and a self-identifier, followed by a period (.) and the method name and parameters. バインドのlet場合と同様に、パラメーターリストはパターンにすることができます。As is the case for let bindings, the parameter-list can be a pattern. 通常、他の .NET Framework 言語で作成されるときに、F# の方法は、組の形式でのかっこ内のパラメーターの表示方法を囲みます。Typically, you enclose method parameters in parentheses in a tuple form, which is the way methods appear in F# when they are created in other .NET Framework languages. ただし、カリー化形式 (パラメーターはスペースで区切られています) も一般的であり、他のパターンもサポートされています。However, the curried form (parameters separated by spaces) is also common, and other patterns are supported also.

次の例は、非抽象インスタンスメソッドの定義と使用方法を示しています。The following example illustrates the definition and use of a non-abstract instance method.

type SomeType(factor0: int) =
   let factor = factor0
   member this.SomeMethod(a, b, c) =
      (a + b + c) * factor

   member this.SomeOtherMethod(a, b, c) =
      this.SomeMethod(a, b, c) * factor

インスタンスメソッド内では、let バインドを使用して定義されたフィールドにアクセスするために、自己識別子を使用しないでください。Within instance methods, do not use the self identifier to access fields defined by using let bindings. 他のメンバーやプロパティにアクセスするときは、自己識別子を使用します。Use the self identifier when accessing other members and properties.

静的メソッドStatic Methods

キーワードstaticは、インスタンスを使用せずにメソッドを呼び出すことができ、オブジェクトインスタンスに関連付けられていないことを指定するために使用されます。The keyword static is used to specify that a method can be called without an instance and is not associated with an object instance. それ以外の場合、メソッドはインスタンスメソッドです。Otherwise, methods are instance methods.

次のセクションの例では、キーワードを使用letして宣言されたフィールドmember 、キーワードで宣言されたプロパティメンバー static 、およびキーワードで宣言された静的メソッドを示しています。The example in the next section shows fields declared with the let keyword, property members declared with the member keyword, and a static method declared with the static keyword.

次の例は、静的メソッドの定義と使用方法を示しています。The following example illustrates the definition and use of static methods. これらのメソッド定義は、前のSomeTypeセクションのクラスに含まれているものとします。Assume that these method definitions are in the SomeType class in the previous section.

static member SomeStaticMethod(a, b, c) =
   (a + b + c)

static member SomeOtherStaticMethod(a, b, c) =
   SomeType.SomeStaticMethod(a, b, c) * 100

抽象メソッドと仮想メソッドAbstract and Virtual Methods

キーワードabstractは、メソッドに仮想ディスパッチスロットがあり、クラスに定義がない可能性があることを示します。The keyword abstract indicates that a method has a virtual dispatch slot and might not have a definition in the class. 仮想ディスパッチスロットは、オブジェクト指向の型の仮想関数呼び出しを検索するために実行時に使用される、内部的に管理された関数のテーブル内のエントリです。A virtual dispatch slot is an entry in an internally maintained table of functions that is used at run time to look up virtual function calls in an object-oriented type. 仮想ディスパッチ機構は、オブジェクト指向プログラミングの重要な機能であるポリモーフィズムを実装するメカニズムです。The virtual dispatch mechanism is the mechanism that implements polymorphism, an important feature of object-oriented programming. 定義のない抽象メソッドを1つ以上持つクラスは抽象クラスであるため、そのクラスのインスタンスを作成することはできません。A class that has at least one abstract method without a definition is an abstract class, which means that no instances can be created of that class. 抽象クラスの詳細については、「抽象クラス」を参照してください。For more information about abstract classes, see Abstract Classes.

抽象メソッドの宣言には、メソッドの本体は含まれません。Abstract method declarations do not include a method body. 代わりに、メソッドの名前の後にコロン (:)およびメソッドの型シグネチャ。Instead, the name of the method is followed by a colon (:) and a type signature for the method. メソッドの型シグネチャは、パラメーター名がない場合を除き、Visual Studio Code エディターでメソッド名の上にマウスポインターを置くと IntelliSense によって表示されるものと同じです。The type signature of a method is the same as that shown by IntelliSense when you pause the mouse pointer over a method name in the Visual Studio Code Editor, except without parameter names. 型シグネチャは、対話的に作業しているときにインタープリター fsi.exe によっても表示されます。Type signatures are also displayed by the interpreter, fsi.exe, when you are working interactively. メソッドの型シグネチャは、適切な区切り記号を使用して、パラメーターの型と戻り値の型を一覧表示することによって作成されます。The type signature of a method is formed by listing out the types of the parameters, followed by the return type, with appropriate separator symbols. カリー化された->パラメーターはで区切られ、 *組のパラメーターはで区切られます。Curried parameters are separated by -> and tuple parameters are separated by *. 戻り値は、常に->シンボルによって引数から区切られます。The return value is always separated from the arguments by a -> symbol. かっこを使用すると、関数の型がパラメーターである場合や、組が2つのパラメーターとしてではなく1つのパラメーターとして扱われるタイミングを指定する場合など、複雑なパラメーターをグループ化できます。Parentheses can be used to group complex parameters, such as when a function type is a parameter, or to indicate when a tuple is treated as a single parameter rather than as two parameters.

このトピックの構文ブロックに示すように、クラスに定義を追加し、 defaultキーワードを使用して、抽象メソッドの既定の定義を指定することもできます。You can also give abstract methods default definitions by adding the definition to the class and using the default keyword, as shown in the syntax block in this topic. 同じクラス内に定義を持つ抽象メソッドは、他の .NET Framework 言語の仮想メソッドに相当します。An abstract method that has a definition in the same class is equivalent to a virtual method in other .NET Framework languages. 定義が存在するかどうかにabstractかかわらず、キーワードによって、クラスの仮想関数テーブルに新しいディスパッチスロットが作成されます。Whether or not a definition exists, the abstract keyword creates a new dispatch slot in the virtual function table for the class.

基底クラスが抽象メソッドを実装するかどうかに関係なく、派生クラスは抽象メソッドの実装を提供できます。Regardless of whether a base class implements its abstract methods, derived classes can provide implementations of abstract methods. 派生クラスで抽象メソッドを実装するにoverrideは、派生クラスで同じ名前とシグネチャを持つメソッドを定義します。ただし、またはdefaultキーワードを使用し、メソッド本体を指定します。To implement an abstract method in a derived class, define a method that has the same name and signature in the derived class, except use the override or default keyword, and provide the method body. キーワードoverrideとはdefaultまったく同じことを意味します。The keywords override and default mean exactly the same thing. 新しいoverrideメソッドが基本クラスの実装をオーバーライドする場合はdefault 、を使用します。元の抽象宣言と同じクラスに実装を作成する場合は、を使用します。Use override if the new method overrides a base class implementation; use default when you create an implementation in the same class as the original abstract declaration. 基底クラスで abstract abstractとして宣言されたメソッドを実装するメソッドでは、キーワードを使用しないでください。Do not use the abstract keyword on the method that implements the method that was declared abstract in the base class.

次の例は、既定のRotate実装を持つ抽象メソッドを示しています。これは .NET Framework 仮想メソッドに相当します。The following example illustrates an abstract method Rotate that has a default implementation, the equivalent of a .NET Framework virtual method.

type Ellipse(a0 : float, b0 : float, theta0 : float) =
    let mutable axis1 = a0
    let mutable axis2 = b0
    let mutable rotAngle = theta0
    abstract member Rotate: float -> unit
    default this.Rotate(delta : float) = rotAngle <- rotAngle + delta

基底クラスのメソッドをオーバーライドする派生クラスの例を次に示します。The following example illustrates a derived class that overrides a base class method. この場合、オーバーライドは、メソッドが何も実行しないように動作を変更します。In this case, the override changes the behavior so that the method does nothing.

type Circle(radius : float) =
    inherit Ellipse(radius, radius, 0.0)
     // Circles are invariant to rotation, so do nothing.
    override this.Rotate(_) = ()

オーバーロードされたメソッドOverloaded Methods

オーバーロードされたメソッドは、指定された型の名前が同じで、引数が異なるメソッドです。Overloaded methods are methods that have identical names in a given type but that have different arguments. でF#は、通常、オーバーロードされたメソッドの代わりに、省略可能な引数が使用されます。In F#, optional arguments are usually used instead of overloaded methods. ただし、オーバーロードされたメソッドは、引数がカリー化形式ではなくタプル形式である場合に、その言語で使用できます。However, overloaded methods are permitted in the language, provided that the arguments are in tuple form, not curried form.

省略可能な引数Optional Arguments

F# 4.1 以降では、メソッドに既定のパラメーター値を持つ省略可能な引数を指定することもできます。Starting with F# 4.1, you can also have optional arguments with a default parameter value in methods. これは、コードとのC#相互運用を容易にするためのものです。This is to help facilitate interoperation with C# code. 構文の例を次に示します。The following example demonstrates the syntax:

// A class with a method M, which takes in an optional integer argument.
type C() =
    __.M([<Optional; DefaultParameterValue(12)>] i) = i + 1

に渡さDefaultParameterValueれる値は入力の種類と一致する必要があることに注意してください。Note that the value passed in for DefaultParameterValue must match the input type. 上記のサンプルではint、です。In the above sample, it is an int. 整数以外の値をにDefaultParameterValue渡そうとすると、コンパイルエラーが発生します。Attempting to pass a non-integer value into DefaultParameterValue would result in a compile error.

例:プロパティとメソッドExample: Properties and Methods

次の例には、フィールド、プライベート関数、プロパティ、および静的メソッドの例を含む型が含まれています。The following example contains a type that has examples of fields, private functions, properties, and a static method.

type RectangleXY(x1 : float, y1: float, x2: float, y2: float) =
    // Field definitions.
    let height = y2 - y1
    let width = x2 - x1
    let area = height * width
    // Private functions.
    static let maxFloat (x: float) (y: float) =
      if x >= y then x else y
    static let minFloat (x: float) (y: float) =
      if x <= y then x else y
    // Properties.
    // Here, "this" is used as the self identifier,
    // but it can be any identifier.
    member this.X1 = x1
    member this.Y1 = y1
    member this.X2 = x2
    member this.Y2 = y2
    // A static method.
    static member intersection(rect1 : RectangleXY, rect2 : RectangleXY) =
       let x1 = maxFloat rect1.X1 rect2.X1
       let y1 = maxFloat rect1.Y1 rect2.Y1
       let x2 = minFloat rect1.X2 rect2.X2
       let y2 = minFloat rect1.Y2 rect2.Y2
       let result : RectangleXY option =
         if ( x2 > x1 && y2 > y1) then
           Some (RectangleXY(x1, y1, x2, y2))
         else
           None
       result

// Test code.
let testIntersection =
    let r1 = RectangleXY(10.0, 10.0, 20.0, 20.0)
    let r2 = RectangleXY(15.0, 15.0, 25.0, 25.0)
    let r3 : RectangleXY option = RectangleXY.intersection(r1, r2)
    match r3 with
    | Some(r3) -> printfn "Intersection rectangle: %f %f %f %f" r3.X1 r3.Y1 r3.X2 r3.Y2
    | None -> printfn "No intersection found."

testIntersection

関連項目See also