2016-11-30 176 views
-1

我打電話給基礎構造函數,但不知何故,我需要指向孩子回來。看看波紋管的例子:調用父構造函數,但保留孩子的參考C#

//兒童

public CompanyEventsView(IAggregator aggregator, IRepository<CompanyEvents> repository, int i) 
     : base(aggregator, repository, i) 
    { 

    } 

//基地

public BaseViewModelFor(IAggregator aggregator, IRepository<TSource> repository, int i) 
    { 
     Aggregator = aggregator; 
     var source = repository.GetKey(i); 
     this.MapFromSourceObject(source); // So "This" here should be pointing to the child class 
    } 

是否有這樣做的方法嗎?

+3

一般來說,你的基類不應該依賴於子類的。基類應該不知道任何兒童類。爲什麼你不能在子構造函數中執行子構造函數? – itsme86

回答

1

thisbase不引用不同的實例,它們是相同的。

如果您在子類中定義了MapFromSourceObject方法,則可以將this轉換爲子類型,例如:(this as CompanyEventsView).MapFromSourceObject(source)

但是這會打敗整個繼承點。

也許定義爲MapFromSourceObject抽象或虛擬的基類?

如果你的基類依賴於子類的實現,那麼使得類本身抽象將是一個更好的主意。

+0

問題是目的地(CompanyEventsView)也是通用的,因此我不能指向CompanyEventsView它有一個通用的指針,如果可能的話(像這個孩子類) –

+0

@NaughtyNinja你還沒有解釋爲什麼你可以不要在孩子的構造函數中做。 – itsme86

+0

@ itsme86因爲這個父構造函數將從100多個類中調用,所以想創建一個這樣做的通用方法,而不是每次創建類時重複相同的函數 –

-1

也許這個例子可以幫助你一點點好繼承:

namespace CSharpConsoleApplication.Tests 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 

    class TemporaryTest 
    { 
     public static void Run() 
     { 
      Mother<FirstCompanyEvent> firstChild = new FirstChild(new FirstCompanyEvent("this is wrong")); 
      firstChild.Print(); 


      Mother<SecondCompanyEvent> intChild = new SecondChild(new SecondCompanyEvent("you are too young to do this")); 
      intChild.Print(); 
     } 
    } 


    public abstract class BaseCompanyEvent 
    { 
     protected string Value { get; private set; } 

     public BaseCompanyEvent(string value) 
     { 
      Value = value; 
     } 

     public abstract string GetMessage(); 
    } 

    public class FirstCompanyEvent : BaseCompanyEvent 
    { 
     public FirstCompanyEvent(string value) 
      : base(value) 
     { } 

     public override string GetMessage() 
     { 
      return "First born: " + Value; 
     } 
    } 

    public class SecondCompanyEvent : BaseCompanyEvent 
    { 
     public SecondCompanyEvent(string value) 
      : base(value) 
     { } 

     public override string GetMessage() 
     { 
      return "Younger brother: " + Value; 
     } 
    } 



    public abstract class Mother<T> where T : BaseCompanyEvent 
    { 
     protected T CustomEvent { get; private set; } 

     public Mother(T customEvent) 
     { 
      CustomEvent = customEvent; 
     } 

     public abstract void Print(); 
    } 

    public class FirstChild : Mother<FirstCompanyEvent> 
    { 
     public FirstChild(FirstCompanyEvent e) 
      : base(e) 
     { } 

     public override void Print() 
     { 
      Console.WriteLine(CustomEvent.GetMessage()); 
     } 
    } 

    public class SecondChild : Mother<SecondCompanyEvent> 
    { 
     public SecondChild(SecondCompanyEvent e) 
      : base(e) 
     { } 

     public override void Print() 
     { 
      Console.WriteLine(CustomEvent.GetMessage()); 
     } 
    } 
}