我有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'。
答案 0 :(得分:1)
遵循面向对象的哲学,“PlaceDetail”对象是一个“放置”对象,所以你不必投射!
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;
}
}
答案 1 :(得分: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
所以你可以说卡车是一辆车。你不能说任何车辆都是卡车(可以是摩托车,也可以是通用车辆)。
要说卡车是车辆根本不改变它,你只是使用更通用的名称。你可以回去称它为卡车。
好的,技术上不是最好的例子,因为我不完全确定通用汽车会是什么样子,但是让我们说存在这样的事情。