FreeBASIC マニュアルのトップに戻る

FreeBASIC Extends

目次→言語リファレンス→変数とデータ型→ユーザ定義型EXTENDS←オリジナル・サイト

EXTENDS 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


新しい型を引き出す基底型を指定します。

構文:
Type|Union typename Extends base_typename
...
End Type|Union

記述:
Extends は、typenamebase_typename から派生することを宣言します。
派生したユーザー定義型 typename は、base_typename 基本型の項目とメソッドを継承します。
typename オブジェクトを、base_typename オブジェクトの代わりに使えます。
base_typename から継承された項目とメソッドは、typename のメンバのように、黙示的にアクセスできます。

ただし、メンバーが同じ識別子を持つ場合、メンバーは、継承されたメンバーを不可視にします。
Base (member access) キーワードを使うと、ローカル・メンバーによって見えなくされた基本タイプのメンバーに、明示的にアクセスできます。

別の型を拡張するユーザー定義型は、先頭に基本型構造を含みます。そして、sizeof() によって取得されるそのサイズは、基本タイプのサイズと、通常のデータ項目(非静的データ項目 )に必要なサイズの和です。
継承を受けたメンバーは、構造体が空でないことを確認するので、派生型は、独自の正規データ項目を持つ必要はありません。

typename(派生ユーザー定義型)で、項目は、typenameUnion である場合にのみ、base_typename と同じメモリ空間を共有することができます。
ここでは、base_typenameUnion かどうかは問題ではありません。
base_typename だけが Union であれば、それは typename (派生ユーザー定義型)からの項目によって影響されることはありません。
Union が、複雑なフィールド(すなわちコンストラクタ/デストラクタを持つユーザー定義型、または動的な文字列)を持つことを許可されていないように、派生 Union は、複雑な base_typename を持つ(含む)ことはできません。

Base (初期化子) キーワードは、派生したユーザ定義型の構築子の一番上に使うことができます。
これは、基底型のための、初期化子または構築子コールを指定できるようにします。

内蔵の Object 型を拡張すると、ユーザー定義型で、演算子 Is が使えるようになります。
これで、実行時型チェックを行い、VirtualAbstract メソッドをサポートし、Override メソッド属性を使えるようになります。

特記: UDTポインタは、「拡張された互換性」(継承階層の上か下)のポインタ型、または Any Ptr にのみ型変換できます。
それ以外の場合は、まず Any Ptr に型変換します(または、両方の型が Object から直接的または間接的に派生している場合は、まず Object Ptr に型変換します)。

例:
Type SchoolMember 'すべての学校のメンバーを表わします'
    Declare Constructor ()
    Declare Sub Init (ByRef _name As String, ByVal _age As Integer)
    As String Name
    As Integer age
End Type

Constructor SchoolMember ()
    Print "Initialized SchoolMember"
End Constructor

Sub SchoolMember.Init (ByRef _name As String, ByVal _age As Integer)
    This.name = _name
    This.age = _age
    Print "Name: "; This.name; "   Age:"; This.age
End Sub


Type Teacher Extends SchoolMember '先生は、SchoolMember に由来することを表します'
    Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
    As Integer salary
    Declare Sub Tell ()
End Type

Constructor Teacher (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
    Print "Initialized Teacher"
    This.Init(_name, _age) '基板メンバー手続きへの暗黙のアクセス'
    This.salary = _salary
End Constructor

Sub Teacher.Tell ()
    Print "Salary:"; This.salary
End Sub


Type Student Extends SchoolMember '学生は、SchoolMember に由来することを表します'
    Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
    As Integer marks
    Declare Sub Tell ()
End Type

Constructor Student (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
    Print "Initialized Student"
    This.Init(_name, _age) '基板メンバー手続きへの暗黙のアクセス'
    This.marks = _marks
End Constructor
   
Sub Student.Tell ()
    Print "Marks:"; This.marks
End Sub


Dim As Teacher t = Teacher("Mrs. Shrividya", 40, 30000)
t.Tell()
Print
Dim As Student s = Student("Swaroop", 22, 75)
s.Tell()
Sleep


' 継承の8つのキーワードをすべて使う例:
'   'Extends', 'Base.', 'Base()', 'Object', 'Is' operator, 'Virtual', 'Abstract', 'Override'

Type root Extends Object ' あらかじめ定義された Object型の遺産によって、RTTI を起動させるために Extend(拡張)
  Declare Function ObjectHierarchy () As String
  Declare Abstract Function ObjectRealType () As String ' 'Abstract' は、overriden でなければならない
                                                        '    局地本体のない関数を宣言します。
  Declare Virtual Destructor () ' 'Virtual' は、本体を備えた解体子を宣言する。('Abstract' 禁止)
Protected:
  Declare Constructor () ' ルートからのユーザ構築を回避
  Declare Constructor (ByRef rhs As root) '' ルートからユーザーのコピー構築を回避
End Type ' 派生型は空のメンバー・データかもしれません

Constructor root ()
End Constructor

Function root.ObjectHierarchy () As String
  Return "Object(forRTTI) <- root"
End Function

Virtual Destructor root ()
  Print "root destructor"
End Destructor


Type animal Extends root ' ルートの継承のための'Extends'
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Virtual Function ObjectRealType () As String Override ' 'Virtual' は、overriden されうる
                                                                '    局所本体と関数を宣言
                                                                ' 関数が、よく無効化であるかどうか
                                                                '    調べるために、'Override'
  Dim Name As String
  Declare virtual Destructor () Override ' 'Virtual' は、局所本体と解体子を宣言
                                         ' 解体子がよく無効化であるかどうか調べるために、'Override'
End Type

Constructor animal (ByRef _name As String = "")
  This.name = _name
End Constructor

Function animal.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- animal" ' 'Base.' は、親メンバー関数へのアクセスを認める
End Function

Virtual Function animal.ObjectRealType () As String
  Return "animal"
End Function

Virtual Destructor animal ()
  Print "  animal destructor: " & This.name
End Destructor


Type dog Extends animal ' 動物の継承のための 'Extends'
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 関数がよく無効化であるかどうか
                                                        '    調べるために、'Override'
  Declare Destructor () Override ' 解体子がよく無効化であるかどうか調べるために、'Override'
End Type ' 派生型は空のメンバー・データかもしれません

Constructor dog (ByRef _name As String = "")
  Base(_name) ' 'Base()' は、親構築子を呼べるように
End Constructor

Function dog.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- dog" ' 'Base.' は、親メンバー関数にアクセスすることを可能にします
End Function

Function dog.ObjectRealType () As String
  Return "dog"
End Function

Destructor dog ()
  Print "    dog destructor: " & This.name
End Destructor


Type cat Extends animal ' 動物の継承のための 'Extends'
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 関数がよく無効化であるかどうか
                                                        '    調べるために、'Override'
  Declare Destructor () Override ' 解体子がよく無効化であるかどうか調べるために、'Override'
End Type ' 派生型は空のメンバー・データかもしれません

Constructor cat (ByRef _name As String = "")
  Base(_name) ' 'Base()' は、親構築子を呼べるように
End Constructor

Function cat.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- cat" ' 'Base.' は、親メンバー関数にアクセスすることを可能にします
End Function

Function cat.ObjectRealType () As String
  Return "cat"
End Function

Destructor cat ()
  Print "    cat destructor: " & This.name
End Destructor


Sub PrintInfo (ByVal p As root Ptr) ' 動物型、犬型および猫型定義の後に置かなければなりません
  Print "  " & p->name, "  " & p->ObjectRealType, "           ";
  If *p Is dog Then ' 'Is' は、型シンボルとの互換性をチェックすることを可能に
    Print  Cast(dog Ptr, p)->ObjectHierarchy
  ElseIf *p Is cat Then ' 'Is' は、型シンボルとの互換性をチェックすることを可能に
    Print Cast(cat Ptr, p)->ObjectHierarchy
  ElseIf *p Is animal Then ' 'Is' は、型シンボルとの互換性をチェックすることを可能に
    Print Cast(animal Ptr, p)->ObjectHierarchy
  End If
End Sub


Print "名前:", "オブジェクト (real):         階層:"
Dim a As root Ptr = New animal("Mouse")
PrintInfo(a)
Dim d As root Ptr = New dog("Buddy")
PrintInfo(d)
Dim c As root Ptr = New cat("Tiger")
Printinfo(c)
Print
Sleep

Delete a
Delete d
Delete c


方言差:

QBからの違い:

参照:
ユーザ定義型 に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-06-26 10:06:22
日本語翻訳:WATANABE Makoto、原文著作者:CountingPine

ホームページのトップに戻る

表示-非営利-継承