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 回答