это концептуальный вопрос. У меня есть абстрактный базовый менеджер, и я определил DispatcherTimer
в моем базовом классе. Я наследую своего базового менеджера еще 4 менеджерами. Вопрос каждый раз, когда я создаю экземпляр менеджеров child
, появился ли новый экземпляр моего менеджера Base
? И будет ли объявлено 4 таймера или это будет только один? Я знаю, что это может быть тривиальный вопрос, но я как бы догнал его.Является ли объект, определенный в абстрактном базовом классе, создает новый экземпляр самого себя при каждом вводе в него?
ответ
Каждый новый экземпляр дочернего класса также является экземпляром базового класса, поэтому у вас есть 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 статическим.
Да, я действительно думал об этом, проблема в том, что это диспетчерTimer, и он имеет событие Tick, которое также станет статическим. Поскольку метод tick вызывает метод избыточного обновления, я не могу сделать таймер статическим. –
Затем сделайте один таймер в другом месте и передайте его конструкторам других объектов, которые вы хотите использовать. – doctorlove
@doctorlove помещает таймер в интерфейс, уменьшая созданные экземпляры? Обратите внимание, что базовый менеджер является абстрактным классом –
Возьмем следующий код:
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
.
Итак, если у меня есть 4 дочерних менеджера, наследующих от одного абстрактного базового менеджера, тогда будут созданы 4 диспетчера тимеров? У каждого есть своя реализация для события Tick? –
@AdityaSharma Сколько типов наследует форма вашего базового класса, не имеет значения. У вас будет столько «диспетчеров», как экземпляры созданных дочерних менеджеров (если, конечно, «диспетчер тимеров» не статичен). См. Обновление моего ответа. – InBetween
Да, маркировка, статичная пришла мне в голову, но проблема в том, что статический таймер будет иметь статическое событие tick. И каждый дочерний менеджер должен иметь собственную реализацию события tick. Вот почему мой таймер находится в абстрактном базовом менеджере и на его тике, который он вызывает, и абстрактном методе. –
Расширение ответа @ InBetween и добавление кода для добавления экземпляра в общий список при построении.
public class FooBase
{
private static List<FooBase> _instances = new List<FooBase>();
public FooBase()
{
_instanves.Add(this);
}
}
public class Foo: FooBase { }
конструктор по умолчанию для Foo
будет неявно вызывать конструктор по умолчанию FooBase
, который добавляет текущий экземпляр списка.
Поддержание списка как объекта выходит из сферы действия может быть сложнее. Самый простой способ - добавить метод для явного удаления экземпляра, но вы должны быть очень строги, чтобы всегда его называть. Другой вариант - реализовать IDisposable
и удалить экземпляр там, но это может открыть целую кучу проблем.
Я не совсем уверен, где вы расширяете мой ответ. Я определенно не рекомендовал бы использовать статическое поле или список для решения этой проблемы. То, как я это сделаю, это вставить таймер (или провайдер таймера) в конструктор. – InBetween
Таким образом, список будет создан только один раз, даже если база получает заложенное столько раз –
@AdityaSharma Да, точно. Тогда ваш таймер также может быть статическим и иметь доступ к списку «FooBase» для прокрутки. Затем вы можете вызывать все, что хотите, на каждой отдельной «FooBase». Вероятно, это не лучший способ сделать это, хотя я бы, вероятно, не рекомендовал это делать. Это просто для иллюстрации того, что возможно. –
- 1. Создает ли Java новый экземпляр итератора() при каждом его вызове?
- 2. Использование Java Generics в абстрактном базовом классе
- 3. Создать экземпляр дочернего класса в абстрактном базовом классе C++
- 4. Не виртуальные методы в абстрактном базовом классе
- 5. Использовать производный тип в базовом абстрактном классе
- 6. Переменные в абстрактном базовом классе модели (Django)?
- 7. Seam @Factory в абстрактном базовом классе?
- 8. Создание экземпляра класса в абстрактном базовом классе в C#
- 9. Переопределение функций в абстрактном базовом классе
- 10. Могу ли я определить конструктор в абстрактном базовом классе?
- 11. производный экземпляр в базовом классе
- 12. Могу ли я использовать общую коллекцию в абстрактном базовом классе?
- 13. Могу ли я хранить данные в абстрактном базовом классе?
- 14. виртуальный desctructor на чистом абстрактном базовом классе
- 15. Определение шаблонного метода преобразователя в абстрактном базовом классе
- 16. Ввод пользовательской реализации ICloneable в абстрактном базовом классе
- 17. Частный экземпляр переменной в абстрактном классе
- 18. Реализация частичного интерфейса C# в базовом/абстрактном классе
- 19. Использовать тип конкретной реализации в абстрактном базовом классе
- 20. Ошибка компоновщика, не объявляя абстрактного метода в абстрактном базовом классе?
- 21. Статические обратные вызовы в абстрактном базовом классе C++
- 22. виртуальные деструкторы в неполиморфном и не абстрактном базовом классе
- 23. C++: доступ к закрытым переменным в абстрактном базовом классе
- 24. Как частично реализовать контракт в абстрактном базовом классе?
- 25. Как включить проверку типов в абстрактном базовом классе в Python
- 26. Создать экземпляр производного класса в базовом классе
- 27. onPostReume в абстрактном классе, получающем нуль ContentView после того, как onCreate в дочернем классе создает экземпляр
- 28. android получить контекст активности в абстрактном базовом классе
- 29. Конструктор в абстрактном классе
- 30. Производный экземпляр класса в базовом классе
Как насчет добавления кода примера? И да, у каждого «ребенка» будет свой собственный экземпляр таймера, если вы не сделаете его одиночным. –
Добавьте некоторую запись/отладочную печать в конструктор 'Base' и посмотрите - или выполните в отладчике – doctorlove
Из интереса - почему вы спрашиваете? В то же время все ваши таймеры стреляют? – doctorlove