Search code examples
c#.netinheritanceobjectinstantiation

Best way to create instance of child object from parent object


I'm creating a child object from a parent object. So the scenario is that I have an object and a child object which adds a distance property for scenarios where I want to search. I've chosen to use inheritance as my UI works equivalently with either a search object or a list of objects not the result of a location search. So in this case inheritance seems a sensible choice.

As present I need to generate a new object MyObjectSearch from an instance of MyObject. At present I'm doing this in the constructor manually by setting properties one by one. I could use reflection but this would be slow. Is there a better way of achieving this kind of object enhancement?

Hopefully my code below illustrates the scenario.

public class MyObject {

    // Some properties and a location.
}

public class MyObjectSearch : MyObject {

    public double Distance { get; set; }
    
    public MyObjectSearch(MyObject obj) {
         base.Prop1 = obj.Prop1;
         base.Prop2 = obj.Prop2;
    }
}

And my search function:

public List<MyObjectSearch> DoSearch(Location loc) { 
  var myObjectSearchList = new List<MyObjectSearch>();       

   foreach (var object in myObjectList) {
       var distance = getDistance();
       var myObjectSearch = new MyObjectSearch(object);
       myObjectSearch.Distance = distance;
       myObjectSearchList.add(myObjectSearch);
   } 
   return myObjectSearchList;
}

Solution

  • The base class needs to define a copy constructor:

    public class MyObject
    {
        protected MyObject(MyObject other)
        {
            this.Prop1=other.Prop1;
            this.Prop2=other.Prop2;
        }
    
        public object Prop1 { get; set; }
        public object Prop2 { get; set; }
    }
    
    public class MyObjectSearch : MyObject
    {
    
        public double Distance { get; set; }
    
        public MyObjectSearch(MyObject obj)
             : base(obj)
        {
            this.Distance=0;
        }
        public MyObjectSearch(MyObjectSearch other)
             : base(other)
        {
            this.Distance=other.Distance;
        }
    }
    

    This way the setting of properties is handled for all derived classes by the base class.


    Optional is to implement ICloneable also

    public class MyObjectSearch : MyObject, ICloneable
    {
        public MyObjectSearch(MyObjectSearch other)
            : base(other)
        {
            ...
        }
    
        ...
    
        public MyObjectSearch Clone()
        {
            return new MyObjectSearch(this);
        }
        object ICloneable.Clone()
        {
            return Clone()
        }
    }