1

在现有结构中添加新类时遇到问题。我将尽可能清楚地解释我的问题

public interface Imust
{
    string Name { get; set; }
    string File { get; set; }
    string RowKey { get; set; }
    string Time { get; set; }
    string PartitionKey { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    

public class _Table <T> : _Account where T : Imust 
{
}

在这里,上述 3 个类在我的项目中实现为表,其属性作为其列。我必须在每个类中实现接口,因为在泛型类中我放置了接口约束。TableServiceEntity 类包含 RowKey 和 PartitionKey 的实现。并且这个类在所有 3 个实体中也是继承的。

问题:现在我必须在我的应用程序中添加一个新表。所以为此我必须在这里添加一个新类

public class TD : TableServiceEntity
{

}    

我不希望此类实现 Imust 接口,因为它不包含这些列。但是我必须将它作为泛型类中的参数传递_Table。因为这个新类具有不同的列,但它执行与其他 3 个实体相同的功能。现在我将如何在维护现有结构的同时添加这个新类?

请建议我为这个问题提供更好的解决方案?

编辑

是的,我可以将约束 TableServiceEntity 作为基类。但是在泛型类_Table中,很少有对File属性进行操作的函数,例如

    public T AccessEntity(string Id = "0", string File = "0")
    {
        return (from e in ServiceContext.CreateQuery<T>(TableName)
                where e.RowKey == Id || e.File == File
                select e).FirstOrDefault();
    }

如果我删除了这个接口约束,那么它会显示一个错误T does not have a defination for File

4

5 回答 5

1

我会这样做...接口在您的声明中没有意义,因为表的更通用类型是 TableServiceEntity

public class _Table <T> : _Account where T : TableServiceEntity
{
}
于 2012-07-24T13:26:04.510 回答
1

将界面一分为二:

public interface Ibase

    string RowKey { get; set; }
    string PartitionKey { get; set; }
}

public interface Imust : Ibase
{
    string Name { get; set; }
    string File { get; set; }
    string Time { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    


public class _BaseTable <T> : _Account where T : Ibase 
{
}

public class _Table <T> : _BaseTable<T> where T : Imust 
{
}

并在_BaseTable和 这个特定于Time和在 中实现通用功能。NameFile_Table

在您对问题进行编辑和编辑之后,它会更加直观。_BaseTable那些依赖于的方法FileName或者Time可以标记为抽象并在_Table.

于 2012-07-24T13:29:37.107 回答
0

为什么不让 _Table 成为<TableServiceEntity>类型?显然,您正在破坏您的接口,因此您不能继续将其用作泛型,因为并非每个类都属于该接口?

于 2012-07-24T13:25:08.820 回答
0
  1. 您有 3 个完全相同的课程(TA、TB 和 TC)。不过,你为什么没有一个班级?
  2. 对于行为(即方法),使用接口。对于结构(即属性),使用继承(如 at TableServiceEntity)。
  3. 让 TD 从基类继承,但不实现接口。
  4. 将限制更改_Tablewhere T : TableServiceEntity

问候

于 2012-07-24T13:25:45.050 回答
0

更新以反映海报的附加信息:

您需要指定一个新的接口:

public interface IMust2 {
    public string File {get;set;}
    public string Rowkey {get;set;

}

修改 IMust 以继承自 IMust2

public interface IMust : IMust2 
{
   public string Name {get;set;}
   public string Time {get;set;}
   public string PartitoinKey {get;set;}
}
于 2012-07-24T13:28:09.690 回答