2017-02-20 11 views
0

это концептуальный вопрос. У меня есть абстрактный базовый менеджер, и я определил DispatcherTimer в моем базовом классе. Я наследую своего базового менеджера еще 4 менеджерами. Вопрос каждый раз, когда я создаю экземпляр менеджеров child, появился ли новый экземпляр моего менеджера Base? И будет ли объявлено 4 таймера или это будет только один? Я знаю, что это может быть тривиальный вопрос, но я как бы догнал его.Является ли объект, определенный в абстрактном базовом классе, создает новый экземпляр самого себя при каждом вводе в него?

+0

Как насчет добавления кода примера? И да, у каждого «ребенка» будет свой собственный экземпляр таймера, если вы не сделаете его одиночным. –

+1

Добавьте некоторую запись/отладочную печать в конструктор 'Base' и посмотрите - или выполните в отладчике – doctorlove

+0

Из интереса - почему вы спрашиваете? В то же время все ваши таймеры стреляют? – doctorlove

ответ

1

Каждый новый экземпляр дочернего класса также является экземпляром базового класса, поэтому у вас есть 4 экземпляра базы, каждая с отдельными таймерами. Если вы хотите, чтобы таймер делился между экземплярами, отметьте его как статический.

Update

Вы можете поделиться экземпляр таймера, как это:

class Class1 
{ 
    void DoSomething() 
    { 
     var timer = new DispatcherTimer(); 
     var m1 = new Manager(timer); 
     var m2 = new Manager(timer); 
     var m3 = new Manager(timer); 
     var m4 = new Manager(timer); 
    } 
} 

abstract class BaseManager 
{ 
    protected abstract void Timer_Tick(object sender, object e); 

    protected BaseManager(DispatcherTimer timer) 
    { 
     timer.Tick += Timer_Tick; 
    } 
} 

class Manager: BaseManager 
{ 
    public Manager(DispatcherTimer timer) 
    : base(timer) { } 

    protected override void Timer_Tick(object sender, object e) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Update

Если вы используете контейнер МОК, вы можете иметь общий экземпляр такой как:

interface IMangerTimer 
{ 
    DispatcherTimer Timer { get; } 
} 

class ManagerTimer : IMangerTimer 
{ 
    public DispatcherTimer Timer { get; } = new DispatcherTimer(); 
} 

abstract class BaseManager 
{ 
    protected abstract void Timer_Tick(object sender, object e); 

    protected BaseManager(IMangerTimer timer) 
    { 
     timer.Timer.Tick += Timer_Tick; 
    } 
} 

Если нет, просто избавиться от интерфейса и сделать класс ManagerTimer статическим.

+0

Да, я действительно думал об этом, проблема в том, что это диспетчерTimer, и он имеет событие Tick, которое также станет статическим. Поскольку метод tick вызывает метод избыточного обновления, я не могу сделать таймер статическим. –

+1

Затем сделайте один таймер в другом месте и передайте его конструкторам других объектов, которые вы хотите использовать. – doctorlove

+0

@doctorlove помещает таймер в интерфейс, уменьшая созданные экземпляры? Обратите внимание, что базовый менеджер является абстрактным классом –

0

Возьмем следующий код:

public class FooBase { } 
public class Foo: FooBase { } 

Теперь, когда вы делаете следующее:

var foo = new Foo(); 

Только один экземпляр создается. Теперь, потому что наследование является «является» отношения, следующее присваивание допустимо:

FooBase fooAsBase = foo; 

Имейте в виду, что, когда новый Foo создается, вся логика, необходимые для создания FooBase также но это не означает, что создаются два разных объекта; в new Foo(), безразмерный конструктор в Foo implicilty вызывает беззаметный конструктор в FooBase.

UPDATE: на основе ваших комментариев, позволяет разработать на примере немного больше:

public class FooBase 
{ 
    Bar someField = new Bar(); 
} 

public class Foo: FooBase { } 

Теперь, учитывая следующий код:

var foo1 = new Foo(); 
var foo2 = new Foo(); 

foo1 будет содержать ссылку на Bar объекта и foo2 сохранит свою ссылку на совершенно другой объект Bar.

+0

Итак, если у меня есть 4 дочерних менеджера, наследующих от одного абстрактного базового менеджера, тогда будут созданы 4 диспетчера тимеров? У каждого есть своя реализация для события Tick? –

+0

@AdityaSharma Сколько типов наследует форма вашего базового класса, не имеет значения. У вас будет столько «диспетчеров», как экземпляры созданных дочерних менеджеров (если, конечно, «диспетчер тимеров» не статичен). См. Обновление моего ответа. – InBetween

+0

Да, маркировка, статичная пришла мне в голову, но проблема в том, что статический таймер будет иметь статическое событие tick. И каждый дочерний менеджер должен иметь собственную реализацию события tick. Вот почему мой таймер находится в абстрактном базовом менеджере и на его тике, который он вызывает, и абстрактном методе. –

1

Расширение ответа @ InBetween и добавление кода для добавления экземпляра в общий список при построении.

public class FooBase 
{ 
    private static List<FooBase> _instances = new List<FooBase>(); 

    public FooBase() 
    { 
     _instanves.Add(this); 
    } 
} 

public class Foo: FooBase { } 

конструктор по умолчанию для Foo будет неявно вызывать конструктор по умолчанию FooBase, который добавляет текущий экземпляр списка.

Поддержание списка как объекта выходит из сферы действия может быть сложнее. Самый простой способ - добавить метод для явного удаления экземпляра, но вы должны быть очень строги, чтобы всегда его называть. Другой вариант - реализовать IDisposable и удалить экземпляр там, но это может открыть целую кучу проблем.

+0

Я не совсем уверен, где вы расширяете мой ответ. Я определенно не рекомендовал бы использовать статическое поле или список для решения этой проблемы. То, как я это сделаю, это вставить таймер (или провайдер таймера) в конструктор. – InBetween

+0

Таким образом, список будет создан только один раз, даже если база получает заложенное столько раз –

+0

@AdityaSharma Да, точно. Тогда ваш таймер также может быть статическим и иметь доступ к списку «FooBase» для прокрутки. Затем вы можете вызывать все, что хотите, на каждой отдельной «FooBase». Вероятно, это не лучший способ сделать это, хотя я бы, вероятно, не рекомендовал это делать. Это просто для иллюстрации того, что возможно. –

Смежные вопросы