У меня есть абстрактный класс A, от которого я получил классы B и C. Класс A предоставляет абстрактный метод DoJOB(), который реализуется обоими производными классами.
Есть класс X, внутри которого есть методы, которым нужно вызывать DoJOB(). Класс X не может содержать код, подобный B.DoJOB() или C.DoJOB().
Пример:
public class X
{
private A foo;
public X(A concrete)
{
foo = concrete;
}
public FunnyMethod()
{
foo.DoJOB();
}
}
При создании экземпляра класса X я хочу решить, какой производный класс (B или C) должен использоваться. Я думал о передаче экземпляра B или C с помощью конструктора X.
X kewl = new X(new C());
kewl.FunnyMethod(); //calls C.DoJOB()
kewl = new X(new B());
kewl.FunnyMethod(); // calls B.DoJOB()
Мой тест показал, что объявление метода с параметром A не работает. Я что-то упускаю? Как я могу реализовать это правильно?
(A является абстрактным, его нельзя создать)
EDIT: Извините, я что-то забыл.
класс A является общим абстрактным синглтоном:
abstract public class A<T> where T : A<T>
{
....
}
public sealed class B : A<B>
{
.....
}
public sealed class C : A<C>
{
.....
}
См. пример: http://www.c-sharpcorner.com/UploadFile/snorrebaard/GenericSingleton11172008110419AM/GenericSingleton.aspx
Под заголовком «Решение с универсальным синглтоном в качестве абстрактного класса»