【问题标题】:Inherited classes — copy data继承类——复制数据
【发布时间】:2013-09-11 13:56:25
【问题描述】:

我有 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”类型。

【问题讨论】:

    标签: c# class inheritance


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您不能强制转换为子类。

      您只能转换为超类:

      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.

      【讨论】:

        猜你喜欢
        • 2014-01-18
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 2021-06-12
        相关资源
        最近更新 更多