继承的类 — 复制数据
本文关键字:复制 数据 继承 | 更新日期: 2023-09-27 18:31:05
我有 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 place = new Place();
place.Name = "A";
....
PlaceDetail placeDetail = (PlaceDetail)place;
无法将类型为"PlacesLibrary.Place"的对象转换为类型"PlacesLibrary.PlaceDetail"。
遵循面向对象的理念,"PlaceDetail"对象是"Place"对象,因此您不必投射!
Place placeDetail = new 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;
}
}
不能强制转换为子类。
只能强制转换为超类:
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
所以你可以说卡车是车辆。你不能说任何车辆都是卡车(它可以是摩托车,也可以是通用车辆)。
说卡车是车辆根本不会改变它,你只是在使用它更通用的名称。你可以回到称它为卡车。
好吧,从技术上讲,这不是最好的例子,因为我不完全确定通用车辆会是什么样子,但假设存在这样的东西。
以下是其他一些示例。而这里。