2011-03-07 104 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作爲屬性,並添加字符串屬性我也需要。