2014-01-30 2 views
1

Я посмотрел и не нашел ничего похожего на то, с чем имею дело. Надеюсь, это решение или предложение для лучшей реализации. У меня есть класс, который может быть передан с необязательным параметром, который сохраняется в созданном экземпляре. Затем у меня есть производный класс с аналогичным необязательным параметром, но в его конструкторе без параметров выполняется другой материал подготовки независимо от необязательного параметра. Какой был бы правильный способ заставить его вызвать конструктор параметров базового класса, но все же сделать непараметрический конструктор полученного., вызывающие как base(), так и конструкторы this()

public class MyBaseClass 
{ 
    protected object preserveParm; 
    protected int someValue; 

    public MyBaseClass() 
    { 
     someValue = 1; 
    } 

    public MyBaseClass(object SomeParm) : this() 
    { 
     preserveParm = SomeParm; 
    } 
} 

public class DerivedClass : MyBaseClass 
{ 
    private int customSecondaryProp; 
    private DateTime when; 

    public DerivedClass() 
    { 
     customSecondaryProp = 10; 
     someValue = 5; 
    } 

    public DerivedClass(object SomeParm) : base(SomeParm) 
    { 
     when = DateTime.Now; 
    } 
} 

Так что, если я делаю

DerivedClass test = new DerivedClass("testing"); 

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

В настоящее время действует метод Derived, который затем попадает в конструктор параметров базового класса, который вызывает «this()» базового класса и возвращает цепочку в конструктор параметров DerivedClass, заканчивается сам , но никогда не попадает в конструктор DerivedClass. Есть ли способ принудительно использовать как базовый, так и безразмерный конструктор DerivedClass без параметров?

+3

я обычно имею непараметризированный конструктор вызвать параметризованный конструктор с соответствующим значением, а не пути вокруг вас» повторять это. Затем вся логика заканчивается в наиболее параметризованном конструкторе (класса) и может вызывать наиболее подходящий конструктор базового класса (который затем, при необходимости, снова заполняет пропущенные параметры, чтобы называть его наиболее параметризованную форму) –

+0

@ Damien_The_Unbeliever, никогда не думал об обратном, потому что фактический входящий объект более сложный, чем просто «объект», но будет изучать его. Благодарю. – DRapp

+0

@nawfal, для вопросов, в которых решение уже было выбрано, не беспокойтесь, пытаясь отменить комментарии к дубликатам ... просто потерянная на мой взгляд. – DRapp

ответ

3

Кажется, вы хотите что-то вроде:

public DerivedClass(object SomeParm) : base(SomeParm), this() 

Но это невозможно в C#: see this answer for details Я предлагаю вам реализовать инициализации производного конструктора в методе и называть его вручную в обоих конструкторах:

public class DerivedClass : MyBaseClass 
{ 
    private int customSecondaryProp; 
    private DateTime when; 

    private void InitializeDerivedClass() 
    { 
     customSecondaryProp = 10; 
     someValue = 5; 
    } 

    public DerivedClass() 
    { 
     InitializeDerivedClass(); 
    } 

    public DerivedClass(object SomeParm): base(SomeParm) 
    { 
     InitializeDerivedClass(); 
     when = DateTime.Now; 
    } 
} 

Если возможно, вы можете также использовать следующий синтаксис для инициализации:

private int customSecondaryProp = 10; 
+0

Хех, это именно то, что я только что ответил. Вы были первыми, поэтому +1, и я удалил свой ответ. :) – hvd

0

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

public DerivedClass(object SomeParam = null) : base(SomeParam) { 
    customSecondaryProp = 10; 
    someValue = 5; 
    if (SomeParam != null) { 
    when = DateTime.Now; 
    } 
} 

public MyBaseClass(object SomeParam) { 
    someValue = 1; 
    preserveParam = SomeParam; 
} 
+0

Потому что независимо от параметра я хочу установить другие вещи, класс НЕ ТРЕБУЕТ параметр. – DRapp

+0

@DRapp - это то, что дает вам дополнительный параметр. Его можно вызвать с помощью 'new DerivedClass()' или 'new DerivedClass (someObj)' – JaredPar

0
public DerivedClass():base(null) 

Вы можете отправить Null конструктору параметра

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