18

次の簡単なキャストの例を参照してください。

int i = 1000;
object o = (object)i; // cast

i.CompareTo(1000);
o.CompareTo(1000); // error

最後の行でエラーが発生する理由を理解しました。intsとは異なり、オブジェクトは実装されないIComparableため、メソッドを公開しませんCompareTo。次の場合もエラーが発生します。

string s = (string)i; // cast error

intとstringsの間に継承がないため、ここではキャストは機能しません。さて、これを見てください:

AudioRender a = new AudioRender();
IBaseFilter b = (IBaseFilter)a; // cast

a.Run(1000); // error
b.Run(1000);

これらのクラスはDirectShowNetライブラリから取得されます。

わかりません。キャストはエラーを生成せず、実行時に例外をスローしないため、AudioRenderはIBaseFilterを実装していると思います。ただし、AudioRenderはIBaseFilterのメソッドを公開しておらず、上記の仮定が間違っていることを示しています...

aを実装する場合、なぜのメソッドを公開bしないのですか? それ以外の場合、実装されていない場合、なぜキャストできますか? また、DirectShowNetを使用せずにこの動作を再現できますか?ab
abab

4

4 に答える 4

15

AudioRenderはConversionOperatorを実装している可能性があります。

ただし、コードを見ると、AudioRenderとIBaseFilterの両方がComImportsであるように見えます。

[ComImport, Guid("e30629d1-27e5-11ce-875d-00608cb78066")]
public class AudioRender { }


[ComImport, ("56a86895-0ad4-11ce-b03a-0020af0ba770"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IBaseFilter { .. }

ご覧のとおり、AudioRenderインポートクラスはIBaseFilterを実装していないため、インテリセンスでは表示されませんが、基盤となるCOMオブジェクトが実装している可能性が高いため、キャストできます。

于 2012-12-11T10:17:50.757 に答える
14

クラスのドキュメントにアクセスせずに判断するのは困難ですが、その上での実装は明示的なインターフェイスAudioRenderの実装であると合理的に推測できます。Run

public AudioRender : IBaseFilter
{
  IBaseFilter.Run(...) {...}
}

つまり、参照Runを介してメソッドにアクセスする場合にのみ、メソッドにアクセスできIBaseFilterます。

于 2012-12-11T10:18:17.413 に答える
6

タイプのソースコードを見ずに、インターフェイスを明示的AudioRenderに実装していると思います。そのため、IntelliSenseのインターフェイスのメソッドは表示されません。IBaseFilter AudioRender

于 2012-12-11T10:17:07.477 に答える
2

実装がbを実装している場合、なぜbのメソッドを公開しないのですか?

これは、インターフェイスを明示的に実装することで実現できます

そうでなければ、aがbを実装していない場合、なぜaをbにキャストできるのでしょうか。

確かにaを実装しているからbです。

また、DirectShowNetを使用せずにこの動作を再現できますか?

はい、できます。上記のリンクからこの例を参照してください(obj.Paint()コンパイラエラーです)。

    interface IControl
    {
        void Paint();
    }

    public class SampleClass : IControl
    {
        void IControl.Paint()
        {
            System.Console.WriteLine("IControl.Paint");
        }
    }

void doit(){
    SampleClass obj = new SampleClass();
    //obj.Paint();  // Compiler error.

    IControl c = (IControl)obj;
    c.Paint();  // Calls IControl.Paint on SampleClass.
}
于 2012-12-11T10:37:41.270 に答える