Включить разные методы, но использовать одно и то же имя - C # - PullRequest
1 голос
/ 12 декабря 2011

Я понимаю, что название может быть очень запутанным, поэтому, чтобы объяснить, что я хотел бы сделать, я проиллюстрирую, как я могу легко решить ту же проблему в PHP.

Например, я даю пользователю своегоПриложение выбирает типы баз данных (например, MySQL, MSSQL и т. д.).

В моем коде я хотел бы иметь только одну функцию для каждой операции, а не функцию для каждой базы данных, как я объясню ниже.

НЕ

main.php

<?php
function mysql_get_users() {
  //Foo
}

function mssql_get_users() {
  //Foo
}

if($dbtype == "mysql") {
  echo mysql_get_users();
}

if($dbtype == "mssql") {
  echo mssql_get_users();
}

?>

НО

main.php

<?php
if($dbtype == "mysql") {
  include("mysql.php");
}

if($dbtype == "mssql") {
  include("mssql.php");
}
echo get_users();
?>

mysql.php

<?php
function get_users() {
  //Foo
}
?>

mssql.php

<?php
function get_users() {
  //Foo
}
?>

Теперь у меня та же проблема, но в C # с использованием Visual Studio 2010. Так как я не могу сделать это:

 if(dbtype=="mysql") {
    public static MySqlConnection connect(String connectionString)
    {
        MySqlConnection connection = new MySqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}

Большая проблема с вышесказанным заключается, в частности, в том, что я не могу поместить выражение if вокруг метода (функции), то мне приходится сталкиваться с проблемами типов, которые являются уникальными для каждого типа базы данных, среди которых я должен включить возвращаемую переменную соединения in каждый метод связан с функцией базы данных.

Итак, есть мысли о том, как это исправить и заставить его работать, как в примере с PHP выше?Я не являюсь ни экспертом, ни новичком в C #, но учусь довольно быстро.

Ответы [ 4 ]

5 голосов
/ 12 декабря 2011

Вы захотите исследовать «интерфейсы» или «делегаты».

Интерфейсы более распространены в разных языках (включая C # и Java) и позволяют вам предоставлять различные реализации (посредством реализации классов), которые все используют одни и те же интерфейсы и могут использоваться взаимозаменяемо.

Делегаты - также довольно крутой вариант, но они ограничены одним методом - который может быть именно тем, что вы ищете здесь. (По сравнению с интерфейсом, который определяет один или несколько методов, которые существуют как часть интерфейса).

Некоторые дополнительные ссылки:

3 голосов
/ 12 декабря 2011

Лично я думаю, что вам нужно подходить к проблеме по-другому.Это где объектно-ориентированное программирование ваш друг.По сути, вы бы абстрагировали специфичные для базы данных вещи, чтобы вызывающий код ничего не знал о том, какую базу данных он использует.Если вы делали это с нуля, вот очень упрощенный пример:

public interface IDatabase {
   void Connect(string ...);
   string Query(string ...);
}

public class MySQLDB : IDatabase {
   void Connect(string ...){
       MySqlConnection connection = new MySqlConnection(connectionString);
       ...
   }

    // same for query, etc
}

public class OracleDB : IDatabase {
   void Connect(string ...){
       // connect using Oracle library
       ...
   }

    // same for query, etc
}

Итак, в своем клиентском коде вы выбираете тип базы данных для создания экземпляра, а затем вызываете те же функции независимо от того,какого это типа:

IDatabase db;
if (dbtype == "mysql")
   db = new MySqlDB();
else if (dbtype == "oracle")
   db = new OracleDB();

db.Connect(...);
...
1 голос
/ 12 декабря 2011
public static IDbConnection connect(String connectionString)
{
    if ( dbtype == "mysql" )
    {
        MySqlConnection connection = new MySqlConnection(connectionString);
        connection.Open();
        return connection;
    }
    else if ( dbtype == "mssql" )
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}
0 голосов
/ 12 декабря 2011

Может быть, вы можете выбрать Factory Method или Strategy, чтобы сделать это. В основном вы можете создать интерфейс для работы:

public interface ConnectionFactory {
    IDBConnection CreateConnection(string connectionString);
}

Затем дайте им другую реализацию, основанную на type.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...