C#, baseのbaseにアクセスする方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
せつ

C#, baseのbaseにアクセスする方法

#1

投稿記事 by せつ » 9年前

久しぶりにお世話になります。

次のようなクラスが用意されています。(他人が作成したものです)

コード:


public class K : J
{
    public override void update()
    {
        base.update();
    }
}

public class L : K
{
// 大量の記述

    public override void update()
    {
        base.update();

        // 書き換えたい処理
        //
    }

}

ここで、L.fのコメント部分を書き換えたクラスを作りたいと考えています。
しかし、

コード:

public class M : L
{
    public override void update()
    {
        base.update();

        // 書き換えた処理
        //
    }
}
としては、K.update=>書き換えたい処理=>書き換えた処理、となってしまいます。
最終手段としては丸々コピーして class L2 : K を作成する、という事は出来ますが、何かほかに良い方法はないでしょうか。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: C#, baseのbaseにアクセスする方法

#2

投稿記事 by YuO » 9年前

仮想メソッドの一部を書き換えるような必要があるならば,書き換える可能性のある部分を仮想メソッドとして分離している必要があります。
今回の場合だと,

コード:

public class L : K
{
    protected virtual void UpdateImpl () { /* ... */ }
    public sealed override void Update () // .NETでは通常publicなメンバーの名前にはPascal Caseを使う
    {
        base.Update();
        UpdateImpl();
    }
}
のようにします。

ただ,今回の内容を見る限り,そもそもMはLなのか,という疑問があります。
Lの実装とMの実装がほぼ同じだからといって,MがLである,とは言えません。
Lの代わりにMのインスタンスを利用しても問題ないのであればよいですが,そうでないならばMはKから派生すべきです。

せつ

Re: C#, baseのbaseにアクセスする方法

#3

投稿記事 by せつ » 9年前

前述のとおり他の人が書いたコードで、それをいじることは出来ません。
要はmod作成を行っていたのですが、この部分を変更することを前提としたコードになっていないようです。
また、L型の参照を使用している箇所が見つかったので、Lを複製する、という手段も取れなくなりました。
Lにインターフェースなどを継承していれば、と思ったり。

手段が無いようなら諦めたいと思います。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: C#, baseのbaseにアクセスする方法

#4

投稿記事 by YuO » 9年前

一応,方法はありますが……。
  • C++/CLIを使う。
    C++/CLIでは, クラス名::メソッド名 の形で呼び出せるため,直接のベースクラス以外のクラスのメソッドを呼び出すことができます。
  • Reflection.Emitでcallを使うILを書く
    C++/CLIと同様のことを,実行時にコード生成してしまう方法。形式的にはC#のみですが,やることはIL (つまりはCLIにおけるアセンブリ言語) を直接書くような形になります。
サンプルを作ってみました。
複数プロジェクトなので,アーカイブを添付しておきます。
また,githubにも同一の物を上げておきます。
オフトピック
正確に書くなら,githubにpushしたあと,

コード:

git archive --format=zip HEAD > ConsoleApplication1.zip
で作成したのが添付のZIPファイル
どちらにしてもメンテナンス性に欠けるため,可能であれば避けることをお薦めします。
添付ファイル
ConsoleApplication1.zip
Visual Studio Community 2015 Update 2 Solution Arcvhive
(26.56 KiB) ダウンロード数: 103 回

閉鎖

“C言語何でも質問掲示板” へ戻る