C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: オーバーライド!!


(過去ログ 47 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■25767 / inTopicNo.1)  オーバーライド!!
  
□投稿者/ やー (12回)-(2008/09/25(Thu) 16:53:14)

分類:[.NET 全般] 

お世話になっております。
オーバーライドについて、いまいち理解できないので、教えて頂きたいです。

使用言語はVisual Basic2005です。

現段階で理解できているのは、基本クラスには「Overridable」と書く。
派生クラスには、「Overrides」と書くことです。

オーバーライドしたときに、どのタイミングで上書きされるのかわかりません。
さらに上書きされると、基本クラスのOverridableのメソッドはどうなってしまうのでしょうか?

以下に、今見ている参考書のソースを記述します。

  ■基本クラス側
  Public Overridable Sub dispData()
MsgBox("正方形面積=" & X * Y)
End Sub

  ■派生クラス側
Public Overrides Sub dispData()
MsgBox("立方体体積=" & X * Y * Z)
End Sub

また、わかりやすいサンプルなどもございましたらお願いできますでしょうか。
以上、宜しくお願い致します。
引用返信 編集キー/
■25769 / inTopicNo.2)  Re[1]: オーバーライド!!
□投稿者/ オガシン (103回)-(2008/09/25(Thu) 17:24:56)
>オーバーライドしたときに、どのタイミングで上書きされるのかわかりません。
>さらに上書きされると、基本クラスのOverridableのメソッドはどうなってしまうのでしょうか?

そのクラスのインスタンスが生成されたときに上書きされます。

Dim Obj As New 基本クラス
Dim Obj2 As New 派生クラス

Obj.dispData()
Obj2.dispData()

上記は普通に定義した内容で表示されます。
下記のようにすると面白いかもしれません。

Obj = Obj2
Obj.dispData()
Obj2.dispData()

これだと両方とも派生クラスのdispDataが呼ばれるはずです。
インスタンスが生成されたときに上書き(再定義)されていることが
分かるのではないでしょうか。
引用返信 編集キー/
■25770 / inTopicNo.3)  Re[2]: オーバーライド!!
□投稿者/ オガシン (104回)-(2008/09/25(Thu) 17:30:47)
一応試したソースのっけときます。

    Sub Main()
        Dim obj As New hoge
        Dim obj2 As New hogehoge

        Console.WriteLine(obj.foo())
        Console.WriteLine(obj2.foo())

        obj = obj2

        Console.WriteLine(obj.foo())
        Console.WriteLine(obj2.foo())

    End Sub

    Class hoge
        Public Overridable Function foo() As String
            Return "hoge"
        End Function
    End Class

    Class hogehoge
        Inherits hoge
        Public Overrides Function foo() As String
            Return "hogehoge"
        End Function
    End Class

出力結果
hoge
hogehoge
hogehoge
hogehoge

引用返信 編集キー/
■25771 / inTopicNo.4)  Re[2]: オーバーライド!!
□投稿者/ 黒龍 (125回)-(2008/09/25(Thu) 17:35:35)
タイミングというとちょっとニュアンスが伝えにくいです。公開されているメソッドと実メソッドの対応表が変更済みのクラスが生成されるというイメージを持つといいように思います。
基本クラスのものは内部には保持しています。派生クラスからbaseキーワードを使うことで呼び出すことができます。
引用返信 編集キー/
■25772 / inTopicNo.5)  Re[3]: オーバーライド!!
□投稿者/ オガシン (105回)-(2008/09/25(Thu) 17:40:30)
No25771 (黒龍 さん) に返信
> タイミングというとちょっとニュアンスが伝えにくいです。公開されているメソッドと実メソッドの対応表が変更済みのクラスが生成されるというイメージを持つといいように思います。
> 基本クラスのものは内部には保持しています。派生クラスからbaseキーワードを使うことで呼び出すことができます。

!! たしかにそうですねOrz
黒龍さんの言われることがあっていると思います。
引用返信 編集キー/
■25773 / inTopicNo.6)  Re[1]: オーバーライド!!
□投稿者/ のん (8回)-(2008/09/25(Thu) 17:41:35)
のん さんの Web サイト
参考になるようなURLをみつけました。
http://www.moug.net/faq/viewtopic.php?t=25603
http://blogs.wankuma.com/torikobito/archive/2007/05/02/75355.aspx

No25767 (やー さん) に返信
> お世話になっております。
> オーバーライドについて、いまいち理解できないので、教えて頂きたいです。
>
> 使用言語はVisual Basic2005です。
>
> 現段階で理解できているのは、基本クラスには「Overridable」と書く。
> 派生クラスには、「Overrides」と書くことです。
>
> オーバーライドしたときに、どのタイミングで上書きされるのかわかりません。
> さらに上書きされると、基本クラスのOverridableのメソッドはどうなってしまうのでしょうか?
>
> 以下に、今見ている参考書のソースを記述します。
>
>   ■基本クラス側
>   Public Overridable Sub dispData()
> MsgBox("正方形面積=" & X * Y)
> End Sub
>
>   ■派生クラス側
> Public Overrides Sub dispData()
> MsgBox("立方体体積=" & X * Y * Z)
> End Sub
>
> また、わかりやすいサンプルなどもございましたらお願いできますでしょうか。
> 以上、宜しくお願い致します。
引用返信 編集キー/
■25774 / inTopicNo.7)  Re[3]: オーバーライド!!
□投稿者/ επιστημη (1340回)-(2008/09/25(Thu) 17:45:22)
επιστημη さんの Web サイト
----- VBだと:

Module Program

Public Class Base
  Public Overridable Sub method()
    System.Console.WriteLine("Base.method")
  End Sub
End Class

Public Class Derived : Inherits Base
  Public Overrides Sub method()
    System.Console.WriteLine("Derived.method")
    MyBase.method() ' 元々のmethodを呼ぶ
  End Sub
End Class

Sub Main()
  Dim obj As Base = New Derived()
  obj.method()
End Sub

End Module

----- C#だと:

public class Base {
  public virtual void method() {
    System.Console.WriteLine("Base.method");
  }
}

public class Derived : Base {
  public override void method() {
    System.Console.WriteLine("Derived.method");
    base.method(); // 元々のmethodを呼ぶ
  }
}

public class Program {
  public static void Main() {
    Base obj = new Derived();
    obj.method();
  }
}

引用返信 編集キー/
■25775 / inTopicNo.8)  Re[2]: オーバーライド!!
□投稿者/ こあら (30回)-(2008/09/25(Thu) 18:22:58)
> オーバーライドしたときに、どのタイミングで上書きされるのかわかりません。
> さらに上書きされると、基本クラスのOverridableのメソッドはどうなってしまうのでしょうか?

> 公開されているメソッドと実メソッドの対応表が変更済みのクラスが生成されるというイメージを持つといいように思います。
> 基本クラスのものは内部には保持しています。派生クラスからbaseキーワードを使うことで呼び出すことができます。

すみません。便乗で。

delphiだと「実行時型情報」を用いて「仮想メソッドテーブル」から呼び出すメソッドを検索します。
#ちなみにこのしくみにより実行時の型に即したメソッド呼び出し(ポリモーフィズム)が可能になっています。

.NETでも、これと似たしくみを持っているという理解でOKですか?
引用返信 編集キー/
■25776 / inTopicNo.9)  Re[1]: オーバーライド!!
□投稿者/ たくボン (37回)-(2008/09/25(Thu) 18:41:21)
No25767 (やー さん) に返信
> オーバーライドについて、いまいち理解できないので、教えて頂きたいです。
> さらに上書きされると、基本クラスのOverridableのメソッドはどうなってしまうのでしょうか?

上書きと考えると後でShadowsの時混乱するかもしれないので、遊んでみました(笑)
少しは理解の助けになるかも


> また、わかりやすいサンプルなどもございましたらお願いできますでしょうか。
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim c As New Cat
        Dim d As New Dog
        c.Bark()
        d.Bark()
        CType(c, Animal).Bark()
        CType(d, Animal).Bark()
    End Sub
End Class

Public Class Animal
    Overridable Sub Bark()
        MessageBox.Show("浜口")
    End Sub
End Class

Public Class Dog
    Inherits Animal
    Shadows Sub Bark()
        MessageBox.Show("ばぅ")
    End Sub
End Class

Public Class Cat
    Inherits Animal
    Overrides Sub Bark()
        MessageBox.Show("にゃあ")
    End Sub
End Class

引用返信 編集キー/
■25796 / inTopicNo.10)  Re[2]: オーバーライド!!
□投稿者/ やー (13回)-(2008/09/26(Fri) 09:53:06)
みなさんありがとうございます。

教えて頂いたサンプルコードを一通り試してみたのですが、1点分からないコードがあります。


επιστημηさんのコードを引用します。

----- VBだと:

Module Program

Public Class Base
Public Overridable Sub method()
System.Console.WriteLine("Base.method")
End Sub
End Class

Public Class Derived : Inherits Base
Public Overrides Sub method()
System.Console.WriteLine("Derived.method")
MyBase.method() ' 元々のmethodを呼ぶ
End Sub
End Class

Sub Main()
Dim obj As Base = New Derived()
obj.method()
End Sub

End Module

このコードの、
Dim obj As Base = New Derived()
の意味がわかりません><

教えて頂けると幸いです。
以上、宜しくお願い致します。
引用返信 編集キー/
■25800 / inTopicNo.11)  Re[3]: オーバーライド!!
□投稿者/ やじゅ (669回)-(2008/09/26(Fri) 09:58:48)
やじゅ さんの Web サイト
No25796 (やー さん) に返信
> Public Class Derived : Inherits Base
> このコードの、
> Dim obj As Base = New Derived()
> の意味がわかりません><
>

obj は、Derivedクラスのインスタンスです。
Derivedクラスは、Baseクラスを継承しているので
型はBaseクラスでもいいわけです。

引用返信 編集キー/
■25801 / inTopicNo.12)  Re[3]: オーバーライド!!
□投稿者/ επιστημη (1342回)-(2008/09/26(Fri) 10:00:24)
επιστημη さんの Web サイト
> Dim obj As Base = New Derived()
> の意味がわかりません><

「Base型の変数objにDerivedをNewして代入する」です。

# このテの基本事項をいちいち掲示板で訊いていてはラチがあきません。
# テキトーな教本を読んでください。

引用返信 編集キー/
■25822 / inTopicNo.13)  Re[4]: オーバーライド!!
□投稿者/ やー (14回)-(2008/09/26(Fri) 11:00:48)
ありがとうございます!!!
解決しました!
解決済み
引用返信 編集キー/
■25845 / inTopicNo.14)  Re[3]: オーバーライド!!
□投稿者/ こあら (31回)-(2008/09/26(Fri) 15:02:10)
No25775 (こあら さん) に返信
> delphiだと「実行時型情報」を用いて「仮想メソッドテーブル」から呼び出すメソッドを検索します。
> #ちなみにこのしくみにより実行時の型に即したメソッド呼び出し(ポリモーフィズム)が可能になっています。
>
> .NETでも、これと似たしくみを持っているという理解でOKですか?

せっかくなので検索してみました。

.NETだと「メタデータ」と「メタデータテーブル(MethodDefテーブル)」がキーワードになるようですね。
http://msdn.microsoft.com/ja-jp/library/65a37919(VS.80).aspx

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -