2016-11-11 28 views
0

はいくつかのコードです:外部クラスの内部クラスからプロパティにアクセスするには?ここ

public class TimerEventArgs : EventArgs 
{ 
    public Timer Timer { get; } 
    public ClockTimer.TimerTimes Times { get; } 
    public DateTime? RunTime { get; } 

    public TimerEventArgs(Timer Timer, ClockTimer.TimerTimes Times, DateTime? RunTime) 
    { 
     this.Timer = Timer; 
     this.Times = Times; 
     this.RunTime = RunTime; 
    } 
} 

public class ClockTimer 
{ 
    public class TimerTimes 
    { 
     public DateTime? Start { get; private set; } 
     public TimeSpan? RunDuration { get; private set; } 
     public DateTime? Stop { get; private set; } 

     public TimerTimes() 
      : this(null, null, null) 
     {} 

     public TimerTimes(DateTime? Start, TimeSpan? RunDuration, DateTime? Stop) 
     { 
      this.Start = Start; 
      this.RunDuration = RunDuration; 
      this.Stop = Stop; 
     } 
    } 
    : 
    private TimerTimes m_TimerTimes = null; 
    : 
    public virtual void Start() 
    { 
     // Start timer if not running. 
     if (!IsRunning) 
     { 
      if (m_Timer == null) 
       m_Timer = new Timer(); 
      m_Timer.Interval = Interval; 
      m_Timer.Tick += new EventHandler(InnerTimerHandler); 

      if (m_TimerTimes == null) 
       m_TimerTimes = new TimerTimes(); 
      m_TimerTimes.Start = DateTime.Now; //Property Start is inaccesssable!! 

      m_Timer.Start(); 

      TimerEventArgs EventArgs = new TimerEventArgs(m_Timer, m_TimerTimes); 

      OnTimerStarted(EventArgs); 
     } 
    } 
    : 
} 

は外部クラスに内部クラスからプロパティを「設定」、それが外部から設定することができないようにする方法はありますか?外部クラスだけが内部クラスプロパティを設定できる必要があります。

+0

目的を指定できますか?どの物件を意味しますか?サンプルをお願いします – rbr94

+1

行:m_TimerTimes.Start = DateTime.Now; – Ron

+0

あなたのコードは非常に不完全で、実際のサンプルとしてコピー&ペーストできません。そして、それは問題のために多くのノイズを含んでいます – grek40

答えて

0

外部クラスのプロパティにアクセスする場合は、使用する操作にpublicを使用します。あなたのケースでは、専用のプロパティget;を読み書きないかsetでそれを変更することができます。

public DateTime? Start { get; set; } 

同じがあなたのネストされたクラスに適用されます。あなたは外のClockTimerTimerTimesにアクセスしたい場合はそうでない場合のみにprivateにそれを設定し、publicとしてそれを残す(shortended例)、それをアクセスするためにClockTimerを許可:

public class ClockTimer { 

    private class TimerTimes { 
     public DateTime? Start { get; set; } 
    } 

    public ClockTimer() { 
     var timerTimes = new TimerTimes(); 
     timerTimes.Start = DateTime.Now; 
    } 
} 
+0

実際の質問は異なります。もう一度読む。 – Thangadurai

+0

@Thangadurai私はそれを編集しました。 – rbr94

1

あなたは、内側privateを作成することができます外部クラスにアクセス可能であるが、それ以上の外部クラスにはアクセスできないpublicプロパティ/メソッドを持つクラス。内部クラスの一部をパブリックにする場合は、何らかのパブリックインターフェイス(プライベート内部クラスを必要に応じてinterfaceclassまたはabstract classにすることができます)からプライベート内部クラスを派生させます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var t = new ClockTimer(); 
     t.Start(); 
     var date = t.TimerTimesInstance.Start; // getter Ok 
     t.TimerTimesInstance.Start = DateTime.Now; // Error! setter denied 
    } 
} 
public class ClockTimer 
{ 
    public interface ITimerTimes 
    { 
     DateTime? Start { get; } 
    } 
    private class TimerTimes : ITimerTimes 
    { 
     public DateTime? Start { get; set; } 
    } 

    private TimerTimes m_TimerTimes = null; 
    public virtual void Start() 
    { 
     m_TimerTimes = new TimerTimes(); 
     m_TimerTimes.Start = DateTime.Now; //Property Start is assessible here 
    } 

    public ITimerTimes TimerTimesInstance { get { return m_TimerTimes; } } 
} 

ご覧のとおり、私は少し例を減らしましたが、必要なコードはすべてそれに含まれているはずです。

+0

なぜ「抽象」ですか? – rbr94

+0

@ rbr94なぜなら、 'Start'は、実際にその値をどこかに設定する実装がなければ意味をなさないからです。 '抽象'は厳密には必要ではなく、意図された使用法を示すだけです。 – grek40

+0

@ grek40それもインターフェイスかもしれません – zerkms

関連する問題