2011-03-07 105 views
3

背景: 我使用的是一组可以连接到CSV,AD,SharePoint,SQL,数据源类型。覆盖抽象类的属性?

我希望使用DBConnection对象的connectionString属性在基于文件的源上存储文件路径以传递给基于文件的数据源的GetData(DBConnection conn)方法。 这不起作用,因为在为ConnectionStribg属性分配字符串时会发生一些验证。 我的问题: 如何创建我自己的DBConnection类派生的类(它是一个抽象类),只需添加一个名为ParameterString的属性?

tldr;我想从System.Data.Common.DBConnect继承并添加我自己的字符串属性。怎么样?

编辑

界面如下:

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); 

} 

回答

3

您可以从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的类的用法复杂化。

+0

类的接口指定DBConnection作为类中使用的方法的参数:请参阅顶部的我的Q中的编辑。 – callisto 2011-03-07 14:50:44

+0

你是否拥有这些课程?如果是这样,你让他们接受任何你想要的。如果你不这样做,那么就传入连接属性。 – RQDQ 2011-03-07 14:52:17

+0

我确实拥有这些类和接口,但是我希望为开发人员提供一个统一的接口,以便在我之后使用它,这就是为什么我使用接口来强制实施每个数据源的类方法的原因。不过,我对其他建议非常乐观。 – callisto 2011-03-07 14:56:42

2

让你的抽象类太...

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

     get; set; 
    } 
} 

如果你不希望你的类是抽象,然后从具体类继承它,或者重写抽象方法。没有第三个选择这里...

+0

这将编译,但是海报正在使用的连接的实现情况如何?他将不得不重写所有这些才能连接到数据源。 – RQDQ 2011-03-07 14:24:12

3

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#类的任何其他属性中。

+0

谢谢丹。有一个upvote呢! :) – callisto 2011-03-07 14:48:05

1

感谢RQDQ:我终于用下面的课上做什么,我需要:

public class GenericConnection 
{ 
    public GenericConnection(){} 

    public DbConnection DBConn { get; set; } 

    public string Filename { get; set; } 

} 

正如你所看到的,我加了System.Data.Common.DBConnect作为属性,并添加字符串属性我也需要。