1

親オブジェクトをその子クラスの 1 つにキャストできないことはわかっています。

では、次の問題を解決するための適切なアプローチは何でしょうか: 親クラス "Person" と 2 つの子クラス、Customer と Employee があるとします。Person クラスは抽象的ではないことに注意してください(インスタンス化できることを意味します)。これで、次のメソッド シグネチャが得られました。

public Person GetPersonById(long id)

これにより、Person またはその子クラスの 1 つを返すことができます。このメソッドを使用すると、GetType() を介して子であるかどうかを確認できます。ただし、子クラスに固有のフィールド/メソッドには、単にキャストできないため、簡単にアクセスできません。1 つの方法は、親クラスをパラメーターとして受け取り、新しい子クラス インスタンスを返す各子クラスのコンストラクターを実装することです。これには、まだ多くの重複コードがあるという欠点があります (すべての子にもすべての親フィールドを割り当てる必要があるため)。

私が考えることができる別のアプローチは、メソッドを次のように変更することです。

public object GetPersonById(long id)

そうすれば、任意のクラスを返すことができました。返されたクラスの型を確認してから、適切にキャストします。しかし、どういうわけか、このアプローチは汚いようです。

誰かがこれを行うためのより良い方法を持っていますか?

4

3 に答える 3

4

それが本当にである場合にキャストできPersonます:CustomerCustomer

var customer = person as Customer;
if(customer != null)
{
    // the person was really a Customer
}

必要に応じて、1 つではなく 3 つのメソッドを作成できます。

public Person GetPersonById(long id)
public Customer GetCustomerById(long id)
public Employee GetEmployeeById(long id)

またはジェネリックを使用します(ただし、その特定のケースではジェネリックについては気分が悪いです):

public T GetPersonById<T>(long id) where T : Person

そしてそれを呼び出します:

var person = GetPersonById<Employee>(123);

ただし、呼び出し時に何を取得しようとしているのかを指定する必要があります。

于 2013-04-11T14:31:15.450 に答える
2

しかし実際には、オブジェクトがその型の場合、親オブジェクトをその子型にキャストできます

于 2013-04-11T14:30:59.090 に答える
0

「is」キーワードを使用する

if(instance is ChildClass)
{
    //...
}
于 2013-04-11T14:30:47.567 に答える