2016-11-30 2 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

this и base не относятся к разным экземплярам, ​​они одинаковы.

Если ваш метод MapFromSourceObject определен в дочернем классе, вы можете сделать this дочернему типу вроде: (this as CompanyEventsView).MapFromSourceObject(source).

Но это победит весь смысл наследования.

Возможно определить MapFromSourceObject как абстрактный или виртуальный в базовом классе?

Если ваш базовый класс зависит от реализаций дочерних классов, то сделать сам абзац класса будет лучшей идеей.

+0

Проблема заключается в том, что назначение (CompanyEventsView) также является общим, поэтому я не могу указать на CompanyEventsView, если это возможно, как универсальный указатель, если это возможно (это как childClass) –

+0

@NaughtyNinja Вы все еще не объяснили, почему вы можете Не делайте этого в конструкторе ребенка. – itsme86

+0

@ itsme86 Becuase, этот родительский конструктор будет вызываться из более чем 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()); 
     } 
    } 
}