继承的类 - 复制数据

时间:2013-09-11 13:56:26

标签: c# class inheritance

我有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'。

2 个答案:

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

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

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

好的,技术上不是最好的例子,因为我不完全确定通用汽车会是什么样子,但是让我们说存在这样的事情。

Here are some other examplesAnd here