1

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

public class Person {
    public string FirstName = "";
    public string LastName = "";
}

および派生クラス:

public class HRPerson : Person {
    public string GetSomething() {
      //calculate something
    }
}

基本的に、基本クラスの機能を拡張したいと考えています。使用方法は次のようになりGetAllPersonますList<Person>

class Program
{
     static List<HRPerson> GetAllHRPerson()
     {
         List<HRPerson> HRPersonList = new List<HRPerson>();
         foreach (Person person in GetAllPerson)
         {
             HRPersonList.Add(person);
         }
         return HRPersonList;
     }
}

パラメータのオーバーロードがないと言ってコンパイルされず、 person を にキャストしようとするとHRPerson、実行時エラー「タイプのオブジェクトをタイプにキャストできませんPersonHRPersonエラーが発生します。

このような追加機能を追加するにはどうすればよいですか?

4

2 に答える 2

6

GetAllPersonHR以外の人を何人か返しているようです...

それが事実であり、それらを除外したいだけであると仮定すると、LINQ のOfTypeメソッドを使用するのが最も簡単です。

static List<HRPerson> GetAllHRPerson()
{
    return GetAllPerson().OfType<HRPerson>().ToList();
}

(補足: 定数以外では、このようなパブリック フィールドは避けてください。フィールドは、パブリック API の一部ではなく、実装の詳細である必要があります。)

もちろん、どのPersonインスタンスも実際に のインスタンスではない場合HRPerson、それは役に立ちません。一度作成したインスタンスのタイプを変更することはできません。あなたの状況がはっきりしていません。この回答が役に立たない場合は、詳細をお知らせください。

編集:拡張メソッドが必要かどうかはまだよくわかりませんが、必要な場合は次のようになります。

public static class PersonExtensions
{
    public static string GetSomething(this Person person)
    {
        // Do something with the given Person
    }
}

Person次に、それをインスタンス メソッドであるかのように呼び出すことができます。

Person person = ...;
string something = person.GetSomething();

しかし、これはポリモーフィックではありません-オブジェクトについて何かを変更しているわけではありません.Personあなたの説明は、あなたが本当にやりたいように聞こえます...

于 2013-03-19T18:51:33.480 に答える
0

Jon Skeetの回答に対するあなたのコメントに基づいて、これはあなたが探しているものですか?

NamedPersonなどのPersonのサブクラスを作成します。NamedPersonにメソッドGetFullNameを指定します。このメソッドは、Personのフルネームを返します。

次に、NamedPersonからサブクラスHRPersonを作成し、GetFullNameをオーバーライドして、わずかに異なる形式で名前を返します。CCPersonもNamedPersonからサブクラス化されます。

Personを制御することはできませんが、NamedPersonを完全に制御することはできます。次に必要なのは、HRPersonsではなく、NamedPersonsのリストです。このリストには、裸のNamedPersons、HRPersons、またはCCPersonsを含めることができますが、リスト上のすべてのオブジェクトはNamedPersonsまたはそのサブクラスになるため、すべてGetFullNameになります。

于 2013-03-19T19:34:09.860 に答える