2013-02-21 4 views
-2

Мне интересно, может ли кто-нибудь помочь мне с тем, что является лучшим способом заполнения базовых свойств производного класса. Я хотел бы использовать один метод для заполнения свойств базы, используется ли база или ребенок.Каков наилучший способ заполнения базовых свойств?

Вот пример того, что я спрашиваю:

public class Parent 
{ 
    public string Id {get; set;} 
} 

public class Child : Parent 
{ 
    public string Name {get; set;} 
} 

public Parent GetParent(int ID) 
{ 
    Parent myParent = new Parent(); 
//Lookup and populate 
return Parent; 
} 

public Child GetChild(string name) 
{ 
Child myChild = new Child(); 

//Use the GetParent method to populate base items 
//and then 
//Lookup and populate Child properties 

return myChild; 
} 
+2

Заполнение через конструктор? – sll

+0

Возможный дубликат [Наполнить базовый класс вместе с дочерним классом?] (Http://stackoverflow.com/questions/3649354/populate-base-class-along-with-child-class) – MethodMan

+0

вы можете делать то, что 'sll' имеет или вы можете взять маршрут Наследование. – MethodMan

ответ

2

Я думаю, что вы могли бы быть усложнять вещи немного. Посмотри на этот коде, который использует наследование и конструктор для инициализации объектов:

public class Parent 
{ 
    public string Id {get; set;} 

    public Parent(string id) 
    { 
     Id = id; 
    } 
} 

public class Child : Parent 
{ 
    public string Name {get; set;} 

    public Child(string id, string name) : base(id) // <-- call base constructor 
    { 
     Name = name; 
    } 
} 

Он использует конструктор для инициализации и base keyword вызвать родительский конструктор из производного класса. Я бы пошел в этом направлении, если вам действительно не нужно, чтобы фабричный метод создавал ваш объект.

1

Что-то вроде этого, если вы не хотите, чтобы сделать это в constructor.

Примечание: constructor не всегда называется, особенно если тип десриализован с использованием определенных сериализаторов.

public class Parent 
{ 

    public string Id {get; set;} 

    public virtual void InitPorperties() { 
     //init properties of base 
    } 

} 


public class Child : Base { 

    public override void InitProperties() { 
     //init Child properties 
     base.InitProperties(); 
    } 
} 

После этого вы можете использовать его как:

public Parent GetParent(int ID) 
{ 
    var myParent = new Parent(); 
    parent.InitProperties(); 
    return myParent; 
} 

public Parent GetChild(int ID) 
{ 
    var child= new Child(); 
    child.InitProperties(); 
    return child; 
} 

Как все, что он имеет другую сторону медали: абонент должен вызвать метод InitProperties в Одер, чтобы получить правильно инициализирован объект.

Если сериализации/desialization не является проблемой в вашем случае, палка с конструкторами, на практике вызова эти методы внутри ctors любого типа (Parent, Child)

1

Если вы не хотите использовать стандартный способ только

Child myChild = new Child(); 
    myChild.Name = "name"; 
    myChild.Id = "1"; 

Вы можете заполнить их с помощью конструктора, как это.

public class Parent 
    { 
     public Parent(string id) 
     { 
      Id = id; 
     } 

     public string Id { get; set; } 
    } 

    public class Child : Parent 
    { 
     public Child(string id, string name) 
      : base(id) 
     { 
      name = Name; 
     } 

     public string Name { get; set; } 
    } 

И когда вы isntanciate это

 Child myChild = new Child("1", "name"); 

на мой взгляд, это довольно изящный способ сделать это.

Смежные вопросы