0

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

public class Place
{
    public string GoogleReference { get; set; }
    public string GoogleID { get; set; }
    public string Name { get; set; }
    public string Vicinity { get; set; }
}

public class PlaceDetail : Place
{
    public string Url { get; set; }
    public string InternationalPhoneNumber { get; set; }
    public string Website { get; set; }
}

Place を PlaceDetail にキャストする方法は? 次のコードが機能しない

Place place = new Place();
place.Name = "A";
....
PlaceDetail placeDetail = (PlaceDetail)place;

タイプ「PlacesLibrary.Place」のオブジェクトをタイプ「PlacesLibrary.PlaceDetail」にキャストできません。

4

2 に答える 2

1

オブジェクト指向の哲学に従って、「PlaceDetail」オブジェクトは「Place」オブジェクトであるため、キャストする必要はありません。

Place placeDetail = new PlaceDetail();

オブジェクトを Place から PlaceDetail に「アップグレード」する場合は、さまざまな方法で進めることができます。たとえば、それを行うためにファクトリ クラスでメソッドを構築し、このファクトリ メソッドにすべての「詳細」を指定するために必要なパラメータを入力できます。

まず、PlaceDetail に「コピー コンストラクター」を実装して、Place から PlaceDetail を初期化する必要があります。

public PlaceDetail(Place p)
{
    this.GoogleReference = p.GoogleReference;
    this.GoogleID = p.GoogleID;
    this.Name = p.Name;
    this.Vicinity = p.Vicinity;
}

次に、次のようにファクトリ メソッドを作成できます。

static class PlaceDetailFactory
{
    public static PlaceDetail create(Place p, string url, string phone, string site)
    {
        PlaceDetail pd = new PlaceDetail(p);
        pd.Url = url;
        pd.InternationalPhoneNumber = phone;
        pd.Website = site;
        return pd;
    }
}
于 2013-09-11T14:23:53.527 に答える
0

サブクラスにキャストすることはできません。

スーパークラスにのみキャストできます。

PlaceDetail placeDetail = new PlaceDetail();
Place place = placeDetail;

この規則は、変数の型ではなく、オブジェクトの実際の型にのみ適用されることに注意してください。オブジェクトの実際の型は同じであるため、スーパークラスにキャストしたら、サブクラスにキャストし直すことができます。ただし、ここではキャストを明示する必要があります。

したがって、これは完全に有効です。

// casting to a superclass
Place place = new PlaceDetail();

// Here 'place' is of type 'Place', but the actual object referenced by 'place' 
//   is of type 'PlaceDetail', so we can cast it to that
PlaceDetail placeDetail = (PlaceDetail)place;

役立つ例:

Vehicle
Truck - subclass of Vehicle
Motorcycle - subclass of Vehicle

したがって、トラックは車両であると言えます。車両がトラックであるとは言えません (オートバイまたは一般的な車両である可能性があります)。

トラックが車両であると言っても、それはまったく変わりません。より一般的な名前を使用しているだけです。トラックと呼ぶことに戻ることができます。

一般的な車両がどのように見えるかは完全にはわからないので、技術的には最良の例ではありませんが、そのようなものが存在したとしましょう.

その他の例を次に示します。そしてここに

于 2013-09-11T14:24:07.760 に答える