2017-01-10 14 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; 
    } 
} 

それでは、私がやりたいことはあるの代わりに、手動で派生クラスでフィールドを設定します、 derivedClassの新しいインスタンスが作成されるたびにbaseClassに自動的に設定したいと思います。これは可能ですか?

+1

これらのプロパティを設定した基本クラスのコンストラクタを作成したときはどうでしたか? – Servy

+2

これは、.NETの命名規則に従うだけで、コードのコードと同じくらいの価値があります。 –

+0

@JonSkeet OKありがとうございます。私の慣習はズボンですが、私は実用的なプログラマーにどこかに横たわっています... – 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はコンパイル時定数ではありません。または、ここでデフォルト値として使用できました。代わりに、基本クラスで自動実装されたプロパティを使用しないでください。これにより、フィールドは実際にはnull可能な型になります。そのため、NullReferenceExceptionを使用せずに値をチェックして初期化できます。あなたの代わりにDateTime.MinValueと同等のデフォルト値であることを気にしない場合は

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 
     {   
     } 
    } 

、デフォルトのパラメータを使用することができます。

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

    } 
関連する問題