簡體   English   中英

如何為常量定義基類或接口?

[英]How to define baseclass or interface for constants?

在我的應用程序中,我需要為多個類定義一組相同的Constant值,並且我想將所有它們的一個基類/接口用作我的通用類的類型參數。

//I know following code will not work, just trying to demonstrate the problem
public interface IConstantsDefined
{
    static const string DbName;
    static const string TableName;
    static const string ColumnName;
}

public static class Product : IConstantsDefined
{
    public static const string DbName = "ProductDB";
    public static const string TableName = "Products";
    public static const string ColumnName = "ProductId";
}

public static class Sales: IConstantsDefined
{
    public static const string DbName = "SalesDb";
    public static const string TableName = "Sales";
    public static const string ColumnName = "SaleId";
}

public class DbConnection<TConsts> where TConsts : IConstantsDefined
{
// use TConsts.DbName, TConsts.TableName here
}

我了解我在上面寫的內容將在C#中引發許多錯誤。 我知道靜態類不能從接口繼承。 我的問題是,在考慮性能和內存的情況下,構建這種系統的最佳設計/方法是什么?

常量被定義和初始化一次。

public interface IConstantsDefined
{
    static const string Foo = "Foo";
    static const string Bar = "Bar";
}

您想要的是抽象的僅獲取字段:

public interface IConstantsDefined
{
    string DbName { get };
    string TableName { get };
    string ColumnName { get };
}

public class Product : IConstantsDefined
{
    public string DbName { get { return "ProductDB" } };
    public string TableName { get { return "Products" } };
    public string ColumnName { get { return "ProductId" } };
}

public class Sales: IConstantsDefined
{
    public string DbName { get { return "ProductDB" } };
    public string TableName { get { return "Sales" } };
    public string ColumnName { get { return "SaleId" } };
}

由於您不需要/想要產品和銷售類型的多個實例,因此您可能要考慮完全刪除這些類型,因為這幾乎是一個類的定義:

public class ConstantsDefined
{
    public string DbName { get; private set; };
    public string TableName { get; private set; };
    public string ColumnName { get; private set; };

    public static readonly ConstantsDefined Product = new ConstantsDefined()
    {
        DbName = "ProductDB",
        TableName = "Products",
        ColumnName = "ProductId",
    };
}

您可以嘗試使用@nabuchodonossor的評論。 或者,您可以創建實現接口IMetadata的元數據類ProductMetadata和SalesMetadata。 然后,在需要時,您可以使用工廠通過傳入實際的Model信息(例如typeof(Sales))來獲取元數據實例。

使用基本抽象類,這是最想要實現的:

abstract class Base
{
    public abstract string DbName { get; }
}
class Product : Base
{
    public override string DbName => "ProductDB";
}
class Sales : Base
{
    public override string DbName => "SalesDB";
}
class DbConnection<T> where T : Base
{
    public string Test(T instance) => instance.DbName;
}

這確實需要instanceinstance可以由DbConnection保留,可以由服務提供者解析,等等。

我所有的Product或Sales類都將包含各種常量,因此我不想創建這些常量的實例

這個要求基本上改變了一切。 在給定的上下文中,您似乎將常量理解為“無法更改的值”。 這是不可變的類型。 然后,您不需要泛型即可使用常量構造類型,只需傳遞參數即可 (就像處理任何不可變類型一樣):

class DbConnection
{
    public string DbName { get; }

    public DbConnection(string dbName)
    {
        DbName = dbName;
    }
}

用法:您只需執行new DbConnection("ProductDB")即可,而不是神秘的new DbConnection<Product>() new DbConnection("ProductDB") 如果您有多個參數,請考慮將其包裝並將實例傳遞給構造函數。 這就是您得到抽象類和非靜態繼承的地方,如我的第一個代碼片段: new DbConnection(new Product()) (而DbConnection將要求傳遞Base類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM