5

私は2つのクラスを持っています:

public class MyBase
{
    public virtual void DoMe()
    {

    }
}

public class MyDerived:MyBase
{
    public override void DoMe()
    {
        throw  new NotImplementedException();
    }
}

そして、MyDerived をインスタンス化する次のコードがあります。

        MyDerived myDerived=new MyDerived();

事は、基底クラスの DoMe をどのように呼び出すかです。myDerived.DoMe() を使用すると、派生メソッドが呼び出され、例外が発生します。myDerived を MyBase にキャストしようとしましたが、呼び出されるメソッドはまだ派生バージョンです。

編集:以下のコメントで述べたように、私のコードではないため、MyDerived または MyBase を変更することはできません。

4

7 に答える 7

4

リフレクションを使用して基本クラス メソッドを取得し、それを呼び出すために必要な IL を発行します。これを行う方法を示すこのブログ投稿を確認してください。このアプローチを使用して、メソッドをオーバーライドする派生クラスへの参照しかないときに、メソッドの基本クラスの実装を呼び出すことに成功しました。

于 2009-11-17T00:22:54.657 に答える
3

基本クラス バージョンを呼び出すことはできません。

メソッドが派生クラスで機能しない場合、派生クラスのインスタンスで呼び出されたときにメソッドの基本バージョンが機能する可能性はほとんどありません。それはただトラブルを求めているだけです。クラスはそのように動作するようには設計されていません。あなたがやろうとしていることは、おそらくクラスの他の部分が予期せぬ動作をする原因になるだけです.

オブジェクトが機能しないことをはっきりと伝えているのに、なぜオブジェクトでこのメソッドを呼び出す必要があるのでしょうか?

これらのクラスにはいくつかの設計上の欠陥があるように思われます。クラスを変更することが許可されていない場合は、代わりに、より適切に設計されたライブラリに変更することが許可されている可能性があります。

于 2009-01-13T05:03:18.633 に答える
0

派生クラスは、メソッドの実装を提供する必要はありません。それを削除すると、基本クラスの実装がデフォルトで呼び出されます。

あなたの例とは異なり、基本クラスのメソッドが抽象的であり、実装を提供する必要がありますが、派生クラスが実装を提供する意味がない場合は、クラスの設計に問題がある可能性があります。

于 2009-01-13T05:54:23.023 に答える
0

あなたの制限を考えると、別の可能性が存在します:

.Net Reflector をダウンロードします。既存のコードを逆コンパイルし、状況をサポートするために必要な変更を加えます。

もちろん、続行する前に、これの合法性を確認してください。

于 2009-01-16T15:36:33.013 に答える
0
public class MyDerived:MyBase{    
    public override void DoMe()    
    {        
        base.DoMe();
    }
}

編集:

サブクラスのメソッドを経由せずに、「外部」から基本クラスのメソッドにアクセスすることはできません。唯一のオプションは、基本クラスを直接インスタンス化し、そのメソッドを呼び出すことです。

MyBase mb = new MyBase();
mb.DoMe();
于 2009-01-13T04:08:09.693 に答える
0

外部クラスから MyBase.DoMe() を呼び出すには、MyBase のインスタンスまたは DoMe() をオーバーライドしない派生インスタンスが必要です。virtual として宣言されたメソッドは、オブジェクトの型ではなく、オブジェクトの実際のランタイム型で呼び出されます。これが、MyBase へのキャストが呼び出されるメソッドを変更しない理由です。ただし、メソッドが MyBase で virtual として宣言されておらず、MyDerived がまだ DoMe() を実装している場合、MyBase の実装を「隠している」ことになります。したがって、参照が MyDerived の場合は MyDerived.DoMe() を呼び出しますが、この場合、MyBase myBase = (MyBase)myDerived にキャストしてから myBase.DoMe() を呼び出すと MyBase.DoMe() が呼び出されます。

于 2009-01-13T04:08:10.553 に答える
0

この質問はとても古いですが、次のオプションが表示されません。

「new」キーワードを使用して、重複するメソッドを指定できます。次に、メソッドを呼び出したいクラスにキャストするだけです。

    public class MyBase
    {
        public virtual void DoMe()
        {

        }
    }

    public class MyDerived:MyBase
    {
//note the use of 'new' and not 'override'
        public new void DoMe()
        {
            throw  new NotImplementedException();
        }
    }

実装

var myDerived = new MyDerived();
var derivedDoMe = myDerived.DoMe();
var baseDoMe = ((MyBase)myDerived).DoMe();
于 2015-11-13T22:32:25.417 に答える