2017-05-29 93 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()'。你可能應該公開一個受保護的getter/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'以從基類中拋出。這樣,其他異常不會被吞噬,這可能會導致相當噁心的錯誤:) – LuckyLikey

+0

@LuckyLikey你是對的,它只是概念不會讓它對起始者來說變得複雜,我們可以使它與字段或屬性以及更多還有更多,因爲我寫的這不是一個好的設計決定 – makison

+0

是的,我看到了。恕我直言,這是一個絕對沒有去,和一個錯過使用例外。然而,你的代碼在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(); 
    { 

    } 
} 

這樣你能夠控制來自父對象的流,並且只需在子對象中調用你需要的方法。