1

new演算子の代わりにオーバーライドと同等のオブジェクトを初期化することは可能ですか?

オブジェクトがあり、それを派生型にキャストしたいとします。それらをobjBaseおよびobjDerivedと呼びましょう。

したがって、このobjDerivedタイプに、objBaseメソッドで新しい修飾子を使用するメソッドがあるが、キャストされたobjBaseオブジェクトで新しいメソッドを使用したいとします。次のようなことを言う方法はありますか?

objBase myObjB = new objBase();
myObjB = *override* objDervied();

たぶん、これをやりたいのは意味がないか、私が見逃している非常に単純な代替手段がありますか?いくつかの工夫された例は、それが役立つ可能性がある時期を示す可能性があると確信しています...実際にこれを行う必要はありませんが、新しい修飾子キーワードについて知ってから、ここ数日はそれについて疑問に思っていましたメソッド。

4

4 に答える 4

2

この場合、オーバーライドする必要はありません。派生オブジェクト参照は、いつでも基本クラス変数に直接割り当てることができます。

objBase myObjB = new objDerived();

インスタンスを作成してすぐに再割り当てすることもお勧めできません。

// Don't instantiate an object in the first line here, 
// since you're going to assign it in the next line
objBase myObjB;  //= new objBase();
myObjB = new objDervied();

はどうかと言うと:

したがって、このobjDerivedタイプに、objBaseメソッドで新しい修飾子を使用するメソッドがあるが、キャストされたobjBaseオブジェクトで新しいメソッドを使用したいとします。

new派生クラスに割り当てたりキャストバックしたりすることによってのみ、基本クラスのメソッドを非表示にするメソッドを呼び出すことができます。

objBase myObjB = new objDerived();
((objDerived)myObjB).Method(); // Will call objDerived.Method

myObjB実際にインスタンスを参照していない場合、これは実行時に失敗しobjDerivedます。

ここでの他のオプションは、を使用することdynamicです。変数にを使用dynamicすると、動的ディスパッチが発生します。これにより、変数は常に「最も派生した」型であるかのように効果的に動作し、新しいメソッドを呼び出します。これは、通常は静的に型指定されている場合でも、C#で複数のディスパッチを効果的に実行できるという点で実際に役立ちます。完全な動作サンプルは次のとおりです。

void Main()
{
    Base b = new Derived();  
    dynamic d = b;
    Console.WriteLine(d.Output());//This prints "Derived"
}

public class Base {
public string Output() {
        return "Base";
}
}

public class Derived:  Base {
    public new string Output() {
        return "Derived";
}
}
于 2013-02-14T16:44:29.877 に答える
1
objBase myObjB = new objDervied();
于 2013-02-14T16:41:41.720 に答える
1

とんでもない!

実行時にメンバーをオーバーライドすることはできません。

これは、C#のように静的に型付けされコンパイルされた言語ではなく、動的言語の機能になります。たとえば、実行時に識別子を再利用できるため、JavaScriptでこれを行います。

var someJsObject = { myMethod: function() { } };
someJsObject.myMethod = function() { alert("hey, I did it!"); };

ちなみに、これは良い習慣ではありません。動的言語(ダックタイピング)を使用していることと、「ねえ、私はアヒルです。以前はクワッククワックと言っていましたが、今は吠えています。アヒル!"。悲しい。

アップデート

ええと...ExpandoObject実際、C#と:を使用してこのようなことを行うことができます

dynamic expando = new ExpandoObject();
expando.MyMethod = new Func<bool>(() => true);

dynamic expando2 = new ExpandoObject();
expando.MyMethod = new Func<string>(() => "What? I've changed!");

expando.MyMethod = expando2.MyMethod;
            
// This will set "What? I've changed!"
string result = expando.MyMethod();

しかし、それはまだ悪い習慣です。

于 2013-02-14T16:46:01.237 に答える
1

したがって、このobjDerivedタイプに、objBaseメソッドで新しい修飾子を使用するメソッドがあるが、キャストされたobjBaseオブジェクトで新しいメソッドを使用したいとします。

あなたが求めているのは、私が推測する次のようなものです。

public class Base {
   public string Write() {
        return "Base";
   }
}

public class Derived:  Base {

    public new string Write() { //HIDES BASE CLASS METHOD
        return "Derived";
   }
}


void Main()
{
    Base b = new Derived();  
    b.Write();//THIS WILL RETURN "BASE"

    Derived d = new Derived();  
    d.Write();//THIS WILL RETURN "DERIVED"
}

派生クラスのメンバーは具象オブジェクトのみをオーバーライドするため、これを行うことはできません。new

inheritance希望どおりに機能するには、基本タイプのみを使用するため、メソッドなどの基本的なOOPの概念を使用する必要がありvirtual/absrtactます。

于 2013-02-14T16:48:37.623 に答える