Скрыть конструктор унаследованного класса - PullRequest
1 голос
/ 18 сентября 2011

Пожалуйста, посмотрите на этот пример:

public class X {
    public X() {
        MessageBox.Show("I'm X");
    }
}

public class Y : X {
    public Y() {
        MessageBox.Show("I'm Y");
    }
}

при выполнении команды Y y = new Y(); в двух окнах сообщений сначала отображается «Я Х», а затем «Я Y».Как я могу избавиться от этого поведения?Что мне нужно, так это остановить конструктор X при создании нового Y.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 18 сентября 2011

Вы можете использовать фабричные методы:

public class X {
    private X() {}
    protected virtual void Init(){
        MessageBox.Show("I'm X");    
    }
    public static GetX() {
        X ret = new X();
        ret.Init();
        return ret;
    }
}

public class Y : X {
    private Y() {}
    protected virtual void Init(){
        MessageBox.Show("I'm Y");    
    }
    public static GetY() {
        Y ret = new Y();
        ret.Init();
        return ret;
    }
}
2 голосов
/ 18 сентября 2011

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

public class X {
    public X() {
        MessageBox.Show("I'm X");
    }
    protected X(int dummy){
    }
}

public class Y : X {
    public Y() : X(0) { //will call other constructor
        MessageBox.Show("I'm Y");
    }
}

Это просто сделает конструктор по умолчанию не вызываемым. Однако, исходя из вашего вопроса - «что мне нужно, это остановить конструктор X при создании нового Y», я не уверен, что вы понимаете основы наследования объектов ... Если вы не хотите создавать новый X при создании нового Y, зачем вам выводить Y из X? Вы знаете, что наследование - это отношения, верно? В твоем случае Y - это Х ...

0 голосов
/ 18 сентября 2011

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

    public class X
    {
    public X()
    {
     if( this.GetType() == typeof(X) )
      Console.WriteLine(( "I'm X" ));
    }

    public class Y : X
    {
     public Y()
     {
      Console.WriteLine(( "I'm Y" ));
     }
    }

    class Program
    {
     static void Main(string[] args)
     {
      Y y = new Y();
     }
    }
    }
0 голосов
/ 18 сентября 2011

:)

Учтите, что Y является подтипом X. Более конкретно, Y нужно, и X должно быть полным. Итак, если вы создадите какой-нибудь Y, он должен быть в состоянии создать X некоторым способом. То есть вам всегда нужно будет вызывать конструктор , но какой из них решать вам. Вы можете указать, какой из них с помощью стратегии в ответе Лучиана:

public Y () : X (...) {

Где вы указываете, какой конструктор X основан на параметрах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...