2017-05-04 43 views
-1

我正在嘗試解決以下面向對象問題。我知道它有點味道,但我必須適應現有的設計。請看下面的代碼片段:C# - 僅在子類中調用覆蓋方法

class Parent 
{ 
    public virtual Context GetContext() 
    { 
     return new Context(true); 
    } 

    public virtual GetData() 
    { 
     var context = GetContext(); 
     var result = Query(context); 
     return result; 
    } 

    public string GetData2() 
    { 
     var context = GetContext(); 
     var result = Query(context); 
     return result; 
    } 

} 

class Child : Parent 
{ 
    public override Context GetContext() 
    { 
     return new Context(false); 
    } 

    public override GetData() 
    { 
     var context = GetContext(); 
     var result = Query(context); 
    } 
} 

我想以下結果:

new Parent().GetData() => would call Parent.GetContext(); 
new Parent().GetData2() => would call Parent.GetContext(); 
new Child().GetData() => would call Child.GetContext(); 
new Child().GetData2() (not overriden in Child) => would call Parent.GetContext(); 

的實際結果是:

new Parent().GetData() => calls Parent.GetContext(); 
new Parent().GetData2() => calls Parent.GetContext(); 
new Child().GetData() => calls Child.GetContext(); 
new Child().GetData2() => calls Child.GetContext(); 
+0

你得到的結果是什麼,它與你想要的有什麼不同? – Servy

+1

問題是......? – Gusman

+1

這不正是默認行爲(不是'虛擬')已經做了什麼,或者我忽略了什麼? – hvd

回答

-2

你可以有這樣的事情:

class Parent 
{ 
    public virtual Context GetContext() 
    { 
     return GetContextParentCall(); 
    } 

    private Context GetContextParentCall() 
    { 
     return new Context(true); 
    } 

    public virtual GetData() 
    { 
     var context = GetContext(); 
     var result = Query(context); 
     return result; 
    } 

    public string GetData2() 
    { 
     var context = GetContextParentCall(); 
     var result = Query(context); 
     return result; 
    } 

} 
+0

問題不在父母身上,而在孩子身上。 – Gusman

+0

按照我設置的方式更改父母,更正孩子的行爲... – Toto

0

您需要覆蓋(替換在這種情況下)的GetData2功能:

class Child : Parent 
    { 
     public override Context GetContext() 
     { 
      return new Context(false); 
     } 

     public override GetData() 
     { 
      var context = GetContext(); 
      var result = Query(context); 
     } 

     public new string GetData2() 
     { 
      var context = base.GetContext(); 
      return Query(context); 
     } 
    } 

請記住,使用new修飾符不會覆蓋基礎功能,如果替換它,這意味着如果你投了ChildParent和你打電話GetData2它會調用舊功能,而不是新的替代功能。

+2

有關「new」修飾符的缺陷的強制性警告可能會有幫助,我猜(即,Child x = new Child(); x.GetData2 );'與'父類x = new Child(); x.GetData2();') – elgonzo