1

5年の経験があります。しかし、正直なところ、私がこの構造を知って使用している間は...

Baseclass bc = new DerivedClass(); 

私はそれが実際に何をしているのか分かりません。派生クラスですか、基本クラスですか。そして、bc.Method() を呼び出すと、派生クラス メソッドが取得されることがわかっています。ただし、新しいキーワードまたはオーバーライドなどを使用する場合のみ。正直なところ、ここで少し曖昧になり始めました。これで基本に戻る必要があると思います。誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

4

DerivedClass のインスタンスを作成し、それを BaseClass 型の変数に割り当てています。これは、Fish と Dog の 2 つの派生クラスを持つ基本クラス Animal のようなものがある場合に役立ちますが、どちらがインスタンス化されるかわからず、定義されたメソッドを呼び出すため、これはコンテキストでは重要ではありません。基本クラスで。たとえば、次のようなものがあります。

Animal a;
if (whatever you want)
    a = new Dog();
else
    a = new Fish();
a.Feed();

Animal に Feed を virtual で定義し、Fish に override で再定義すると、Fish バージョンが実行される (実行時にリンクされる) ため、修飾子の使用には注意してください。ベース バージョンを virtual としてマークせず、Fish バージョンを new としてマークしない場合、Animal バージョンが実行されます (コンパイル時にリンクされます)。

于 2012-05-24T09:36:15.870 に答える
2

のインスタンスを作成し、それをタイプにDerivedClass暗黙的にキャストBaseclassします。

これがコンパイルされると私が思うので、それはどちらかDerivedClassがから継承することを意味しますBaseclass、例えば:

class DerivedClass : Baseclass
{
}

または、これらの型間でキャストするための暗黙のキャスト演算子があります。

class DerivedClass
{
    public static implicit operator Baseclass(DerivedClass d)
    {
        // return a Baseclass here
    }
}
于 2012-05-24T09:26:46.180 に答える
1

以下を使用して

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string RoleName { get; set; }
}

の新しいインスタンスを作成してもEmployee、変数宣言が実際Personには である場合、発生するのは への暗黙のキャストだけです。Personつまり、 のメソッドやプロパティのいずれにもアクセスできませんEmployeeEmployeeのコンストラクターがのコンストラクターに影響を与える場合、これは役立つと思いますがPerson、 では何も気にしませんがEmployee、お勧めしません。代わりに、より明確なポリモーフィズムを利用する方法を構築することをお勧めします。これは、派生オブジェクトがパラメーターとして使用される場合で、実際にはパラメーターの型がそのベースの 1 つの型である場合などです。

public void DoSomething(Employee employee)
{
    // here we do something with an employee
    // ...

    string fullName = GetTheirFullName(employee);
}

public string GetTheirFullName(Person person)
{
    return (person.FirstName + " " + person.LastName).Trim();
}
于 2012-05-24T09:33:24.440 に答える
0

のインスタンスを作成し、DerivedClassBaseClassタイプのbcに割り当てるだけです。

于 2012-05-24T09:26:26.977 に答える