2017-01-10 2 views
-1

Мне просто интересно, я сейчас пишу модель данных на C# для сайта блога, и я использую производные классы. Но раздражает то, что я должен инициализировать поля производного класса конструктор базового класса, как показано ниже:Возможно ли иметь конструктор в производном классе также код пожара в конструкторе базового класса?

public class baseClass 
{ 
    public dateTime dateCreated { get; protected set; } //only protected because that's what I need... 
} 

public class derivedClas : baseClass 
{ 
    public derivedClass 
    { 
    this.dateCreated = DateTime.Now; 
    } 
} 

Так что я хочу сделать, это вместо того, чтобы вручную установки поля в производном классе, Я хочу установить его автоматически в baseClass всякий раз, когда создается новый экземпляр производного класса. Это возможно?

+1

Итак, что произошло, когда вы создали конструктор базового класса, который заполнял эти свойства? – Servy

+2

Как в стороне, стоит соблюдать соглашения об именах .NET в SO так же, как и в коде prod ... –

+0

@JonSkeet ОК спасибо, tbh мои соглашения - штаны, но у меня есть прагматичный программист, лежащий где-то ... – RhysO

ответ

0

Если вы реализуете конструктор базового класса, который имеет соответствующую подпись (те же типы параметров), что и ваш производный класс, базовый конструктор будет вызываться автоматически.

public class BaseClass 
{ 
    public DateTime DateCreated { get; protected set; } //only protected because that's what I need... 

    public BaseClass() 
    { 
     DateCreated = DateTime.Now; 
    } 

} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 
    } 
} 
+0

Спасибо, но это не то, что я хочу сделать. Я хочу упустить инициализацию из конструктора производного класса, поэтому он автоматически устанавливается в предопределенное значение в конструкторе baseClass. – RhysO

+0

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

+0

OK спасибо, я соглашусь, когда смогу – RhysO

0

Это то, чего вы надеетесь достичь?

void Main() 
{ 
    var i = new B(); 
    i.Time.Dump(); 
} 

// Define other methods and classes here 
public class A 
{ 
    public A() 
    { 
     Time = DateTime.Now; 
    } 
    public DateTime Time {get;set;} 
} 

public class B : A 
{ 
    public B() : base() 
    { 

    } 
} 
0

Это должно сделать трюк для вас:

public class baseClass 
{ 
    public dateTime dateCreated { get; protected set; } 
    protected baseClass() { 
    dateCreated = DateTime.Now; 
    } 
} 

public class derivedClas : baseClass 
{ 
    public derivedClass() : base() 
    { 
    //Do some constructor stuff for derivedClass if needed 
    } 
} 

это будет вызывать конструктор базового класса перед конструктором в производном классе.

Или, если вы просто хотите, значения по умолчанию для вашей даты вы можете сделать это:

public class baseClass 
{ 
    private DateTime _date = DateTime.Now; 
    public DateTime dateCreated { get {return _date;} protected set { _date = value;} } 

} 

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

0

К сожалению, DateTime.Now не является константой времени компиляции, или мы могли бы использовать ее здесь как значение по умолчанию. Вместо этого нам не нужно будет использовать автоматически реализованное свойство в базовом классе. Это позволяет нашему полю фактически быть нулевым типом, поэтому мы можем его инициализировать с проверкой его значения без NullReferenceException.

public class BaseClass 
    {  
     private DateTime? _dc; //notice, it's nullable 
     public DateTime DateCreated 
      { 
       get 
       { 
       if(_dc == null) 
        _dc = InitDate(); 
       return (DateTime)_dc; 
       } 
       set 
       { _dc = value; } 

      } 
     private static DateTime InitDate() 
     { return DateTime.Now; } 
    } 

    public class DerivedClass : BaseClass 
    { 
     public DerivedClass 
     {   
     } 
    } 

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

public class BaseClass 
    { 
     public DateTime DateCreated { get; set; } = new DateTime(); 

    }