Переопределение свойства абстрактного класса? - PullRequest
3 голосов
/ 07 марта 2011

Справочная информация: Я использую класс System.Data.Common.DBConnect для набора классов, которые подключаются к различным типам источников данных, таких как CSV, AD, SharePoint, SQL, Excel, SQL и т. Д. Существует интерфейс, который определяет контракт для всех типов источников данных.

Я хотел использовать свойство connectionString объекта DBConnection для хранения путей к файлам в файловых источниках для передачи в методы GetData(DBConnection conn) для файловых источников данных. Это не работает, так как при назначении строки в свойстве ConnectionStribg происходит некоторая проверка. Мой вопрос: Как мне создать свой собственный класс, производный от класса DBConnection (это абстрактный класс), который ТОЛЬКО ДОБАВЛЯЕТ одно свойство с именем ParameterString?

tldr; Я хочу наследовать от System.Data.Common.DBConnect и добавить свое собственное строковое свойство. Как?

EDIT

Интерфейс выглядит следующим образом:

public interface IDataImport
{
    DbConnection CreateDbConnection(params string[] connectionString);

    DataSet GetResults(DbConnection conn, params string[] strQuery);

    DataTable GetAvailableTables(DbConnection conn);

   DataTable GetAvailableFields(DbConnection conn, string tableName);

}

Ответы [ 4 ]

3 голосов
/ 07 марта 2011

Вы можете наследовать от DBConnection, но проблема в том, что вам нужно будет реализовать все унаследованные абстрактные члены (которых их 22):

public class MyConnect : DBConnection
{
   public string FilePaths{ get; set; }

   //Still need to implement all of the 
}

Я предполагаю, что вы действительно хотитеВоспользуйтесь встроенными классами ADO, которые обрабатывают реализацию DBConnection , так что это не очень хороший вариант.

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

Вы можете сделать что-то вроде:

public class MyConnectionInfo
{
   public DBConnection Connection { get; set; }

   public string FileNames { get; set; }  
}

Это объединит информацию, но не усложнитиспользование класса DBConnection.

3 голосов
/ 07 марта 2011

Класс DbConnection является абстрактным, поэтому вы должны реализовать все его абстрактные методы.Вот как это выглядит:

protected override System.Data.Common.DbTransaction BeginDbTransaction(System.Data.IsolationLevel isolationLevel)
{
    throw new System.NotImplementedException();
}

public override string ConnectionString
{
    get
    {
        throw new System.NotImplementedException();
    }
    set
    {
        throw new System.NotImplementedException();
    }
}

public override void ChangeDatabase(string databaseName)
{
    throw new System.NotImplementedException();
}

public override void Close()
{
    throw new System.NotImplementedException();
}

protected override System.Data.Common.DbCommand CreateDbCommand()
{
    throw new System.NotImplementedException();
}

public override string DataSource
{
    get { throw new System.NotImplementedException(); }
}

public override string Database
{
    get { throw new System.NotImplementedException(); }
}

public override void Open()
{
    throw new System.NotImplementedException();
}

public override string ServerVersion
{
    get { throw new System.NotImplementedException(); }
}

public override System.Data.ConnectionState State
{
    get { throw new System.NotImplementedException(); }
}

Конечно, вам нужно будет установить правильную логику в каждом из методов, которые генерируют исключения ниже.

Свойство ConnectionString дает вам примеро том, как переопределить свойство.Если вам нужно дополнительное свойство, вы можете добавить его, как и любое другое свойство в класс C #.

2 голосов
/ 07 марта 2011

Сделайте свой класс тоже абстрактным ...

public abstract class MyClass:System.Data.Common.DBConnect 
{
    abstract String ParameterString
    {

        get; set;
    }   
}

Если вы не хотите, чтобы ваш класс был абстрактным, то либо наследуйте его от конкретного класса, либо переопределите абстрактные методы. Здесь нет третьего варианта ...

1 голос
/ 08 марта 2011

Благодаря RQDQ: я наконец-то использовал следующий класс, чтобы сделать то, что мне нужно:

public class GenericConnection
{
    public GenericConnection(){}

    public DbConnection DBConn { get; set; }

    public string Filename { get; set; }

}

Как видите, я добавил System.Data.Common.DBConnect в качестве атрибута и добавилСтроковый атрибут мне тоже нужен.

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