Лучшее использование абстрактных классов переопределения в приложении

1

Предположим, у меня есть один абстрактный класс, например, DatabaseConnection с 3 РЕФЕРАТ методы Openconnection, Executequery, closeconnection.
Этот класс DatabaseConnection наследуется разными классами, чтобы установить соединение с сервером mysql, oracle, sql... Так как же структура унаследованной классы?
и каков наилучший способ создания экземпляра производного класса, который увеличивает ремонтопригодность и повторное использование кода?

Теги:
oop
design-patterns

3 ответа

3

Если у вас есть абстрактный класс:

public abstract class DatabaseConnection
{
   public DatabaseConnection(...) // Optional if you want a base constructor
                                     with or without required parameters.
   public abstract void OpenConnection();
   ...
}

Тогда реализация просто должна переопределить все:

public class SQLServerDatabaseConnection : DatabaseConnection
{
   public SQLServerDatabaseConnection(...) //Whatever params you want
   //Or public SQLServerDatabaseConnection(...) : base (...) //if base has required params
   {
   }

   public override void OpenConnection()
   {
   }

   ...//Overrides for every other pure virtual method
}
1

То, что вы пытаетесь реализовать, очень похоже на модель поставщика данных, которая уже реализована в ADO.NET. У вас есть уровень абстракции, доступный в пространстве имен System.Data.Common в виде DbCommand, DbDataAdapter, DbDataReader и т.д. Затем ваш уровень доступа к данным (DAL) может быть записан агентом-агентом данных, что означает, что вы используете фабрики для intantiate фактические типы поставщиков данных, которые реализуют общие/абстрактные классы и/или интерфейсы. В ADO фабрики знают, какой провайдер должен создать экземпляр, используя атрибут dataProvider предоставленной строки подключения. http://www.devx.com/dotnet/Article/27297

  • 0
    Я бы пошел дальше и сказал, используя LINQ / Entity Framework или NHibernate. Переходя к категории вопроса, которая является oop / design, я не воспринял вопрос буквально, это может быть просто пример и общий вопрос об oop.
1

Сначала создайте интерфейс для класса. Класс, реализующий интерфейс, гораздо проще заменить, когда на него ссылается этот интерфейс, чем когда он был указан непосредственно в вашем коде. Интерфейсы помогают сделать ваш код более удобным.

Во-вторых, используйте среду инъекций для создания экземпляров вашего класса базы данных.

например, с помощью NInject.. В какой-то момент вашего приложения привяжите интерфейс к желаемой реализации...

Bind<IDatabaseConnection>.To<MySqlConnection>();

создать экземпляр где-нибудь в вашем приложении...

// Creates an instance of the class bound 
IDatabaseConnection connection = _kernel.Get<IDatabaseConnection>(); 
  • 0
    Я не собираюсь понижать голос, но я бы дважды подумал, прежде чем сказать, что для абстрактного класса нет подходящего варианта использования. У него вполне может быть один, хотя DBConnection звучит скорее как интерфейс.
  • 0
    Я никогда не говорил, что у него не должно быть базового класса. Вы можете реализовать интерфейс так, как вам нравится, и в этом весь смысл использования интерфейса. Вопрос о ремонтопригодности и структуре. То, как реализованы внутренности одного класса, на самом деле не имеет к этому отношения, но не волнуйтесь, я не собираюсь отказываться от голосования;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню