これは概念的な質問です。私は抽象的なベースマネージャーを持っており、ベースクラスにDispatcherTimer
を定義しました。私は4人のマネージャーによって私のベースマネージャーを継承します。問題は、child
マネージャのインスタンスを作成するたびに、Base
マネージャの新しいインスタンスが作成されますか?そして、4つのタイマーが宣言されているのでしょうか?私はこれが些細な質問かもしれないことを知っていますが、私はちょっとそれに巻き込まれました。抽象基底クラスで定義されたオブジェクトは、その都度固有のインスタンスを作成しますか?
答えて
子クラスのそれぞれの新しいインスタンスもベースクラスのインスタンスです。ベースのインスタンスが4つあり、それぞれ別々のタイマーがあります。インスタンス間でタイマーを共有する場合は、スタティックとマークします。
更新
あなたはこのようにタイマーインスタンスを共有することができます。
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();
}
}
更新
あなたはIOCコンテナを使用している場合は、の共有インスタンスを持つことができますこのようなインターフェース:
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クラスを静的にしてください。
はい、私はそれについて考えていました、問題は、それはdispatcherTimerであり、静的になるTickイベント。 tickメソッドはオーバーライドされたrefreshメソッドを呼び出すので、タイマーを静的にすることはできません。 –
他のどこかの単一のタイマーを作成し、それを使用したい他のオブジェクトのコンストラクタに渡します。 – doctorlove
@doctorloveは、作成されたインスタンスを減らすために、タイマーをインターフェイスに配置しますか?ベースマネージャーは抽象クラス –
は、次のコードを取る:
public class FooBase { }
public class Foo: FooBase { }
を今すぐあなたが行うときは、次の
var foo = new Foo();
だけインスタンスが作成されます。継承はあるので今、関係「である」、次の代入は有効です。
FooBase fooAsBase = foo;
が新しいFoo
が作成されると、すべてのロジックは、FooBase
を作成するために必要なことを、心に留めておくかもされます2つの異なるオブジェクトが生成されているわけではありません。 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人の子マネージャーを1人の抽象基本マネージャーから継承したら、4つのdispatcherTimersが作成されますか? Tickイベントのための独自の実装を持つそれぞれは? –
@AdityaSharma基本クラスを継承するフォームの種類はいくつですか? 'dispatcherTimers'がもちろん静的でない限り、あなたが作成する子マネージャーのインスタンスと同じくらい多くの' dispatcherTimers'を持っています。私の答えへの更新を見てください。 – InBetween
はいそれを静的にすることは私の心に浮かびましたが、問題はスタティックタイマーが静的なチックイベントを持つことです。そして、それぞれの子マネージャーは、それ自身がtickイベントを実装する必要があります。だから、私のタイマーが抽象的なベースマネージャーにあり、そのタイマーイベントで呼び出され、抽象メソッドを呼び出すのです。 –
@ InBetweenの答えで展開し、インスタンスを構築時に共有リストに追加するコードを追加しました。
public class FooBase
{
private static List<FooBase> _instances = new List<FooBase>();
public FooBase()
{
_instanves.Add(this);
}
}
public class Foo: FooBase { }
Foo
のデフォルトコンストラクタが暗黙的にリストに現在のインスタンスを追加しますFooBase
のデフォルトコンストラクタを呼び出します。
範囲外になるオブジェクトとしてリストを管理するのは難しい場合があります。最も簡単な方法は、インスタンスを明示的に削除するメソッドを追加することですが、常にそれを呼び出すことについては非常に厳格でなければなりません。もう1つの選択肢はIDisposable
を実装してそこのインスタンスを削除することですが、それは問題の全体を開くことができます。
私は自分の答えをどこに広げているのかは分かりません。この問題を解決するために静的なフィールドやリストを使用することは間違いありません。私がこれを行う方法は、コンストラクタにタイマー(またはタイマープロバイダ)を注入することです。 – InBetween
そのため、リストにはベースが何回も組み込まれていても1回だけ作成されます。 –
@AdityaSharmaはい、正確です。その後、あなたのタイマーも静的になり、 'FooBase'のリストにアクセスしてループします。あなたは、それぞれの個々の 'FooBase'であなたが望むものを呼び出すことができます。これはおそらくこれを行うための最良の方法ではありません、私はおそらくそれを行うことをお勧めしません。これは可能なことを説明するためのものです。 –
- 1. 抽象基底クラスから子クラスのオブジェクトを返します
- 2. Djangoで作成され、抽象基底クラスで変更された
- 3. Versionプロパティで抽象基底クラスSession.Lockと抽象基本クラス
- 4. RhinoMocksと抽象基底クラス
- 5. NHibernateと抽象エンティティの基底クラスの作成
- 6. python抽象基底クラス、mixinと抽象メソッドの違い
- 7. 大きな抽象基底クラス
- 8. Entity Framework 4 + DBContext T4 +抽象基底クラス
- 9. 抽象クラスで定義された非抽象イベントは、派生クラス用のデザイナーに表示されません
- 10. Hibernate Annotation抽象基底クラスを継承します
- 11. C++抽象基底クラスメソッドを使用して派生クラスを作成
- 12. クラス階層の設計 - インタフェース+基底クラス対抽象クラス
- 13. 抽象クラス定義
- 14. オブジェクト作成に静的クラスまたは抽象クラスを使用
- 15. リフレクトで抽象基底クラスからコンストラクタにアクセスする
- 16. Javaの抽象クラス - オブジェクトの作成
- 17. 派生クラスは、私はインスタンス化さてしまったその派生クラスのかを知る必要がある基底クラスのコンストラクタで基底クラスのコンストラクタ
- 18. 抽象クラス抽象クラスBの新しいインスタンスをインスタンス化できません
- 19. Typescript:拡張クラス/動的戻り型で定義された型の基本クラスのインスタンスを作成します。
- 20. TypeScriptでは、抽象クラスから派生したクラス(インスタンスではない)として定義されたプロパティからインスタンス化できますか?
- 21. 抽象基底のコンストラクタで新しい派生型を作成する
- 22. TS2511:抽象クラス 'Validator'のインスタンスを作成できません
- 23. 抽象基底クラスのアクティビティコンテキストを取得する
- 24. Fluent NHibernate抽象基底クラスのマッピングをオーバーライドする方法
- 25. 抽象クラスで定義されたプロパティ値を取得
- 26. 親クラスで定義された型を使用している基底クラス
- 27. Typescriptで抽象基底クラスに混合する
- 28. Kotlinで抽象クラスのインスタンスを作成する
- 29. 取り扱い抽象クラスから固有のクラスやタイプパラメータ
- 30. 抽象オブジェクトまたはクラスのようなオブジェクトを作成する
サンプルコードを追加するのはどうですか?そして、あなたがシングルトンにしない限り、それぞれの「子供」はタイマーの独自のインスタンスを持ちます。 –
'Base'コンストラクタにいくつかのロギング/デバッグプリントを追加して、デバッガで一歩一歩歩いてください。 – doctorlove
興味がありません - なぜ尋ねますか?あなたのタイマーはすべて同じタイミングで発砲していますか? – doctorlove