Лучший способ реализовать логику, чтобы два одинаковых класса имели как общую, так и разную функциональность - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь настроить уровень доступа к базе данных, с которым можно общаться, скажем, SQL db, а также некоторые базы данных noSQL.Я имею в виду один интерфейс, такой как IDataManager, который будет иметь общие функции, такие как GetData (), putData (), addTable (), dropTable (), а также оба БД могут иметь индивидуальную функциональность, как БД noSQL позволяет вставлять данные из XML или плоскихи т. д. Как мне реализовать фабричную логику или логику доступа для этой иерархии в моем клиентском коде?

interface IdataManager 
{
   getData();
   putData();
   addTable();
   dropTable();
}

class NoSQLManager : Idatamanager
{
   //implements all common functions
   getData();
   putData();
   addTable();
   dropTable();

   //also declares some additional ones 
   putDatausingXML();
}

class SQLManager : Idatamanager
{
   //implements all common functions
   getData();
   putData();
   addTable();
   dropTable();

   //also declares some additional ones 
   putDatausinglocaltable();
}

//Now in my code to access above DAL logic , lets say I create a simple factory 

class dataAccessFactory 
{
  IdataManager getDataManager(int id)
  {
    dataManager dm = null;
    if(id==1)
      dm = new NoSQLManager();
    else if(id==2)
      dm = new SQLManager();
    return dm;
  }
}

Logic to access above factory :

dataAccessFactory daf = new dataAccessFactory ();
IdataManager noSqlObj = daf.getDataManager(1);
noSqlObj.putDatausingXML(); //problem this wont work.

Я хочу иметь доступ к дополнительным функциям, таким как putDatausingXML, а также к обычнымтакие функции, как getData () с использованием noSqlObj

Но используя данное наследование и логику, я смогу получить доступ только к функциям, входящим в базовый интерфейс IdataManager.

1 Ответ

0 голосов
/ 16 июня 2019

Смысл интерфейсов в том, чтобы следующий уровень мог писать код, используя методы интерфейса, и не беспокоиться о базовой реализации.То, что вы пытаетесь сделать, сводит на нет смысл использования интерфейсов.Если вам нужно вызвать что-то вроде putDataUsingXML(), то вызывающая сторона знает, что им нужна база данных в стиле NOSQL, а не база данных SQL.Даже ваше имя переменной noSqlObj.Так какой смысл создавать интерфейс, который подразумевает скрытие этих деталей?

Если вам действительно нужно это сделать, вы можете привести интерфейс к базовой реализации.

((NoSqlManager)noSqlObj).putDatausingXML();

Но выдолжен действительно переоценить то, что вы пытаетесь достичь здесь.

...