2016-04-19 9 views
2

初めてC#でメソッドをオーバーライドする作業をしています。基本について十分に理解していると思います。しかし、私のメソッドは少し複雑で、メソッド内のいくつかの呼び出しメソッドです。C#でクラスをオーバーライドし、オーバーライドメソッドを使用する仮想メソッドにアクセスする

私は本質的には、基本クラスのメソッドを使用する方法を見つけることによって自分自身をコードの書き込みを保存しようとしていますが、基本クラスのメソッドが使用するオーバーライドされたメソッドを呼び出します。私はあまりにもそれを説明されないことがありますようここ

が、私の問題の一例です:

namespace exampleCode 
{ 
    public class BaseClass : AnotherClass 
    { 
     public static string OrderStorageContainer = "Deliverables"; 

     public virtual string CustomerStorageContainer = "CustomerDocs"; 

     public virtual string GetSomething(typeStorage st, string FileName) 
     { 
      if (String.IsNullOrWhiteSpace(FileName)) 
      { 
       throw new ArgumentNullException("FileName", "The filename of the file should be supplied!"); 
      } 

      var c = GetReference(GetName(st));   
      return c.ToString(); 
     } 
     public virtual string GetName(typeStorage st) 
     { 
      switch (st) 
      { 
       case typeStorage.CustomerProvided: 
        return CustomerStorageContainer.ToLower(); 
       case typeStorage.SystemGenerated: 
        return OrderStorageContainer.ToLower(); 
      } 
      throw new InvalidOperationException("No container defined for storage type: " + st.ToString()); 
     } 

     public virtual string GetReference() 
     { 
      //does stuff 
     } 
    } 

    public class DervivedClass : BaseClass 
    { 
     public static string QuoteStorageContainer = "QuoteDeliverables"; 

     public override string CustomerStorageContainer = "QuoteCustomerDocs"; 

     public override string GetSomething(typeStorage st, string FileName) 
     { 
      if (String.IsNullOrWhiteSpace(FileName)) 
      { 
       throw new ArgumentNullException("FileName", "The filename of the file should be supplied!"); 
      } 

      var c = GetReference(GetName(st));   
      return c.ToString(); 
     } 

     public override string GetName(typeStorage st) 
     { 
      switch (st) 
      { 
       case typeStorage.CustomerProvided: 
        return CustomerStorageContainer.ToLower(); 
       case typeStorage.SystemGenerated: 
        return QuoteStorageContainer.ToLower(); 
      } 
      throw new InvalidOperationException("No container defined for storage type: " + st.ToString()); 
     } 

    } 
} 

基本的に、私は、派生クラスがオーバーライドGetSomethingメソッドを使用します。ただし、オーバーライドされたGetName()メソッドの結果を基底クラスGetReference()メソッドで呼び出すようにしてください。

これは正しい行に沿っていますか?私は同じようなexmapleをオンラインで見つけるのは難しいと思っています。

すべてのポインタは素晴らしいでしょう!

+1

としてそれを書くことによって予防措置を取るべきで、基本クラスを呼び出すためには、限り、あなたは、あなたが電話するよ 'GetReference'メソッドをオーバーライドしないように、私には右のルックスベースのもの。それをオーバーライドする場合は、引き続き 'base.GetReference()'を使用することができます。 –

答えて

2

あなたの実装は正しいようです。 DerivedClassのGetReference()メソッドをオーバーライドしない限り、正しいことになります。

あなたがvar c = GetReference(GetName(st));をしたい場合は、この行は常にあなたがbase.GetReference(GetName(st))

+0

コードが正しいと思われるので、この質問をCodeReviewサイトに移動しないでください。 –

+1

サンプルコード( 'BaseClass:AnotherClass')がオフトピックになるため、現在の状態ではありません。 – Heslacher

1

あなたは正しい方向にいると思います。混乱を避け、コンパイラが必要とする実装を使用するように、ベースとこれを使うのがよいでしょう。

関連する問題