继承的类 — 复制数据

本文关键字:复制 数据 继承 | 更新日期: 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

所以你可以说卡车是车辆。你不能说任何车辆都是卡车(它可以是摩托车,也可以是通用车辆)。

说卡车是车辆根本不会改变它,你只是在使用它更通用的名称。你可以回到称它为卡车。

好吧,从技术上讲,这不是最好的例子,因为我不完全确定通用车辆会是什么样子,但假设存在这样的东西。

以下是其他一些示例。而这里。