я отредактировал вопрос, чтобы быть более понятным. старый вопрос ниже.
У меня есть 2 дочерних класса с собственной реализацией клиента базы данных, но все еще с тем же интерфейсом родительской базы данных (т. Е. Таким как шаблон репозитория).
class Child1
{
protected IDB_Child1 DB;
public void Disconnect()
{
DB.disconnect();
}
}
class Child2
{
protected IDB_Child2 DB;
public void Disconnect()
{
DB.Disconnect();
}
}
interface IDB_Child1 : IDB {}
interface IDB_Child2 : IDB {}
interface IDB { void Disconnect() }
это работает:
Child1 c1 = new Child1();
c1.Disconnect(); //OK
очевидно, что я хочу перенести общую функциональность, описанную выше, на родителя, как самый базовый шаг рефакторинга. я делаю:
abstract class Parent
{
protected IDB DB;
public void Disconnect()
{
DB.Disconnect();
}
}
class Child1 : Parent
{
protected IDB_Child1 DB;
}
class Child2 : Parent
{
protected IDB_Child2 DB;
}
по какой-то причине C # имеет собственную область видимости для таких переменных, и я не могу получить доступ к БД из родительского класса:
Child1 c1 = new Child1();
c1.Disconnect(); // ERROR: DB is null in the parent even though in the c1 it is initialized and visible from child1 class methods.
как мне добиться такой базовой функциональности ООП?