Создать дочерний объект в родительском конструкторе - PullRequest
3 голосов
/ 09 декабря 2010

Можно ли создать экземпляр дочернего объекта, используя конструктор родителя и передав ему некоторый параметр (в данном случае строку), чтобы указать тип дочернего объекта, который должен быть создан?

Ответы [ 3 ]

8 голосов
/ 09 декабря 2010

Нет.В C # вы создаете экземпляр класса, затем , среда выполнения вызывает его конструктор.К тому времени, когда конструктор исполняется, уже слишком поздно выбирать другой тип.

Однако конструктор производного класса всегда вызывает один из конструкторов своего базового класса, и вы можете использовать это в своих интересах (чтобы избежать повторения кода).

Люди часто создают фабрики , чтобы делать то, о чем вы говорите.Например, учитывая классы Parent, Child1:Parent и Child2:Parent, вы можете написать фабрику следующим образом:

public class ParentFactory {
    public Parent CreateParent(string type) {
        switch(type) {
            case "Child1":
                return new Child1();
            case "Child2":
                return new Child2();
            default:
                throw new ArgumentException("Unexpected type");
        }
    }
}
1 голос
/ 09 декабря 2010

Если я правильно вас понимаю, вы хотите создать класс A и класс B, производный от A . Тогда вы хотите вызвать new A("B"), и это должно вернуть вам новый объект B?

Это невозможно.

Однако я не знаю, что вы пытаетесь выполнить, но, возможно, вам стоит проверить отражение , потому что оно позволяет вам создавать экземпляр класса по его имени.

http://msdn.microsoft.com/en-us/library/dex1ss7c.aspx

var obj = myAssembly.CreateInstance("myNamespace.myClassB");
0 голосов
/ 09 декабря 2010

Не уверен, правильно ли я понял, но вот что я понял:)

public class parent:child
{
    private child childObj;
    public parent(string childName)
    {
        childObj = new child(childName);
    }

}
public class child
{
    private string name;

    public child(string _name)
    {
        name = _name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...