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

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

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

Re[2]: 静的メソッドの多重定義


(過去ログ 102 を表示中)

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

■60606 / inTopicNo.1)  静的メソッドの多重定義
  
□投稿者/ bob (1回)-(2011/07/12(Tue) 14:30:06)

分類:[C#] 

静的メソッドの多重定義について質問させてください。
(C#初心者です。)

以下のようにベースクラスと派生クラスがあります。

ClassBでWriteの実装を少し変えたいのですが、静的メソッドのためオーバーライドできません。
この場合の一般的な解決方法を教えていただけますでしょうか?

(new修飾子をつけようと考えましたが調べたところ極力つかわないほうがよいとなっていましたので
質問させていただきました)

public class ClassA
    {
    public ClassA()
    {
    }

  public static void Write()
    {
    }


public class ClassB : ClassA
  {
    public ClassB()
    {
    }

引用返信 編集キー/
■60612 / inTopicNo.2)  Re[1]: 静的メソッドの多重定義
□投稿者/ 逆運の覇者 (28回)-(2011/07/12(Tue) 17:46:42)
ttp://channel9.msdn.com/Forums/TechOff/250972-Static-Inheritance
以下抜粋



class A
{
public virtual static void Foo() { }
}

class B : A
{
public override static void Foo() { }
}

class C : A
{
public override static void Foo() { }
}
コンパイラはA.foo()を見つけると、どのように使用する派生クラスを知るのでしょうか?
通常の仮想メソッドでは、実際の型のvtableが含まれている『this』ポインタを取得する。
静的メソッドで、そのように利用できるような情報はありません。



静的な継承が有用である理由を私は知らない。
OOPは、インスタンスおよびオブジェクトとカプセル化です。
多くの静的メソッドを使用すると、手続き型プログラミングにフォールバックするようなものです。
引用返信 編集キー/
■60613 / inTopicNo.3)  Re[2]: 静的メソッドの多重定義
□投稿者/ 逆運の覇者 (29回)-(2011/07/12(Tue) 17:51:46)
それと余談ですが、多重定義というとオーバーロードのほうを思い浮かべますね。
オーバーライドを多重定義というと私は「?」という感じです。
引用返信 編集キー/
■60622 / inTopicNo.4)  Re[1]: 静的メソッドの多重定義
□投稿者/ Azulean (780回)-(2011/07/12(Tue) 22:47:01)
No60606 (bob さん) に返信
> ClassBでWriteの実装を少し変えたいのですが、静的メソッドのためオーバーライドできません。
> この場合の一般的な解決方法を教えていただけますでしょうか?

すでに指摘されているようにできません。

ところで、なぜ、Write は静的メソッドなのでしょうか。
たぶん、A の中で Write を使っていて、その挙動を変えたいという狙いがあるのですよね?
そうであるならば、静的メソッドをやめるべきだと提言しておきます。


> (new修飾子をつけようと考えましたが調べたところ極力つかわないほうがよいとなっていましたので
> 質問させていただきました)

なぜなのかを気にしていますか?
引用返信 編集キー/
■60825 / inTopicNo.5)  Re[1]: 静的メソッドの多重定義
□投稿者/ くり太郎 (31回)-(2011/07/20(Wed) 14:26:31)
くり太郎 さんの Web サイト
No60606 (bob さん) に返信
> 静的メソッドの多重定義について質問させてください。
> (C#初心者です。)
>
> 以下のようにベースクラスと派生クラスがあります。
>
> ClassBでWriteの実装を少し変えたいのですが、静的メソッドのためオーバーライドできません。
> この場合の一般的な解決方法を教えていただけますでしょうか?
>
> (new修飾子をつけようと考えましたが調べたところ極力つかわないほうがよいとなっていましたので
> 質問させていただきました)

静的なメソッドをどうしたいのかということにもよりますが、自分なら異なるメソッド名を用意します。

引用返信 編集キー/
■60829 / inTopicNo.6)  Re[2]: 静的メソッドの多重定義
□投稿者/ PATIO (121回)-(2011/07/20(Wed) 14:45:44)
> ところで、なぜ、Write は静的メソッドなのでしょうか。
私もAzuleanさんの疑問と同じ疑問を持ちました。
静的なメソッドであると言う事はメンバー変数等に依存しない処理だと
思うので派生先で挙動を変えたいというのが良く分からないです。

仮想関数をオーバーライドする場合の使い方として
親クラスのポインタをつかって呼び出した時にクラスの実体に
合わせて挙動をかえると言うのがあると思うのですけれど、
静的な関数の場合、実態がなくても呼び出せるのでオーバーライドする
意味があるのかなぁと。

キーワードとしての組み合わせと言う意味では静的関数をオーバーライド
という組合せもあると思いますけれど、
実際の使い道等まで考えると意味を成さない組合せと言うのはあると
思いますし、場合によってはそういう組合せ自体ができないケースも
あると思うのでどういう利用シーンを想定してそういう事をしたいのか
と言う部分まで説明すると話が通りやすくなると思います。
もしかしたら問題へのアプローチその物がまずいケースもあるでしょうし。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -