Хорошо, что ваша попытка не сработала, вы бы ввели ошибку, если она сработала.
Предположим, у меня есть переменные a
, b
типа EmpresaDao
.a
инициализируется с Empresa
родителем, а b
инициализируется с Assessoria
родителем.Поскольку a
и b
относятся к одному и тому же типу, должна быть возможность использовать одно вместо другого везде.Предположим, что Assessoria
, но не Empresa
, имеет метод assess()
.Но вы ожидаете, что b.parent
будет Assessoria
, поэтому вы хотите позвонить b.parent.assess()
, но вы не можете позвонить a.parent.assess()
Это означает, что a
и b
не должны быть одного типа.
Решение зависит от того, будете ли вы когда-либо вызывать .parent.assess()
:
a) Если вы никогда не будете вызывать .parent.assess()
в классе EmpresaDao
, пусть тип времени компиляции родителя всегда будет Empresa
,Вот решение:
public class EmpresaDao
{
private Empresa parent {get; set; }
public EmpresaDao(Func<Empresa> parentConstructor)
{
this.parent = parentConstructor();
}
}
static main()
{
var withEmpresaParent = new EmpresaDao(() => new Empresa());
var withAssessoriaParent = new EmpresaDao(() => new Assessoria());
..
}
b) Иногда вы будете звонить .parent.assess()
в классе EmpresaDao.Затем вы должны сделать EmpresaDao универсальным, как сказал @siride:
public class EmpresaDao<T> where T : Empresa
{
private T parent {get; set;}
}
Однако все равно вам придется проверять время выполнения для родителя перед вызовом .parent.assess()
Что означает, чточто-то не так в вашем дизайне.Но недостаточно информации, чтобы решить, что.Может быть, .assess()
метод должен быть закрытым и не вызываться извне (то есть Assessoria
должен быть декоратором для Empresa
: подкласс, но с тем же интерфейсом) Может быть "Empresa
удерживает EmpresaDao
" и "Assessoria
проведение EmpresaDao
"должно быть двух разных классов.(возможно, реализуя тот же интерфейс)
Редактировать: Теперь я понимаю, что в своем решении я по ошибке сделал тип родительского Empresa или Assessoria вместо GenericDao или GenericDao.Я верю, что мое главное все еще в силе.