2017-05-29 4 views
0

私は抽象クラスを継承しています。親メソッドではいくつかの条件をチェックし、発生した場合はChildメソッドの実行を停止する必要があります。しかし、returnの後、子供はそのコードを続けています!メソッドは無効にする必要があります。 また、私はthrow new Exception();を試しましたが、動作しません。継承メソッドを抽象で停止する

public abstract class ParentClass 
{ 
    public virtual void Method() 
    { 
     if (true) 
     { 
      // do something 
      Console.WriteLine("Parent Method should stop it's child!"); 
      return; /* So the child should be stopped to call it's things*/ 
      // Also checked by throw exception. 
     } 
    } 
} 

そしてChildClass

public class ChildClass :ParentClass 
{ 
    public override void Method() 
    { 
     base.Method(); // Also checked by try/catch 
     Console.WriteLine("Should't be run"); 
    } 
} 

に、どのように私はそうのように行うことができます(親が子プロセスを制御継続するかどうかを)?

+0

オーバーライドは、子供が、彼らがやりたいことを意味します。彼らは 'base.Method()'を呼び出す必要はありません。あなたはおそらく、子供が仕事をする必要があるかどうかを返す保護されたゲッタ/メソッドを公開する必要があります。 – Rob

+1

なぜあなたの子供の方法は呼ばれるべきではないと思いますか?親メソッドを終了するだけで、子メソッドはとにかく呼び出されます。 – ckruczek

+0

'return'文は現在のメソッドからのみ返されます。したがって、' ParentClass'によって宣言されたものからあなたのケースに戻ります。しかしこれは、呼び出し元のメソッド( 'ChildClass.Method()')で実行されているそれ以上の文を停止しません。 – bassfader

答えて

2

は、それはあなたがそれをやっている方法でそれを行うには非常に悪い設計上の決定だと言うする必要がありますが、あなたが本当にそのようにそれを必要とする場合

public abstract class ParentClass 
{ 
    public virtual void Method() 
    { 
     if (true) 
     { 
      // do something 
      Console.WriteLine("Parent Method should stop it's child!"); 
      throw new Exception(); 
     } 
    } 
} 

public class ChildClass : ParentClass 
{ 
    public override void Method() 
    { 
     try 
     { 
      base.Method(); 
     } 
     catch (Exception) 
     { 
      return; 
     } 
     Console.WriteLine("Should't be run"); 
    } 
} 
+0

は、ベースクラスからスローされる 'PreventFromRunningException'のような新しいException Typeを作成するかもしれません。そうすれば、他の例外は飲み込まれず、かなりバグが発生する可能性があります。 – LuckyLikey

+0

@LuckyLikeyあなたは正しいです、それはスターターにとって複雑なことではないという唯一のコンセプトです。フィールドやプロパティなどでもそれを作ることができます私はそれが良いデザインの決定ではないと書いたように、より多く – makison

+0

うん、私はそれを見てきました。 IMHO、これは絶対的なNO GOであり、例外の使い方が間違っています。しかし、あなたのコードは、OPの願いで動作します。私のコメントは、潜在的なエラーの余分な情報源を少なくとも導入しないようにわずかに改善されました。 – LuckyLikey

0

我々はブールにメソッドのシグネチャを変更する場合は、あなたがこれを行うことができます:

class ParentClass 
{ 
    public virtual bool Method() 
    { 
     return false; 
    } 
} 

class ChildClass : ParentClass 
{ 
    public override bool Method() 
    { 
     var toContinue = base.Method(); 
     if (!toContinue) 
     { 
      return false; 
     } 

     //Continue.. 

     return true; 
    } 
} 
1

を私は何を探していることは、「テンプレートの方法」だと思う:

public abstract class ParentClass 
{ 
    public void Method() 
    { 
     FirstOperation(); 
     if (.. some condition ..) 
     { 
      SecondOperation(); 
      // do something 
      Console.WriteLine("Parent Method should stop it's child!"); 
     } 
     else 
     { 
      ThirdOperation(); 
     } 
    } 

    protected abstract void FirstOperation(); 
    protected abstract void SecondOperation(); 
    protected abstract void ThirdOperation(); 
} 


public class ChildClass :ParentClass 
{ 
    protected override void FirstOperation(); 
    { 

    } 

    protected override void SecondOperation(); 
    { 

    } 

    protected override void ThirdOperation(); 
    { 

    } 
} 

この方法で、あなた親オブジェクトからのフローを制御し、子オブジェクトで必要なメソッドを呼び出すことができます。

関連する問題