我在数据库中有两个表几乎用于相同的表,但表没有完全相同的结构。
假设我有一个用于手动请求的表和另一个用于自动请求的表。我必须将两个表加载到同一个GridView中,并且我正在使用自定义业务对象。
为了说明我将称之为TManualReqTable和TAutomaticReqTable的问题。
TManualReqTable
- ID
- Field1
- Field2
- Field3
- Field4
和
TAutomaticReqTable
- ID
- Field1
- Field3
在代码中,我对这两个表使用相同的对象。我有一个接口与两个表的所有属性,我正在检查当我将数据加载到对象时该字段是否存在。
但我认为应该使用两个对象和一个带有摘要方法的超类来创建。
您对此有何看法?
答案 0 :(得分:4)
我会创建一个界面IRequest
来描述字段&两种方法共有的方法,然后是接口&实现ManualRequest
的{{1}}和AutomaticRequest
的类,并添加每个类的唯一方法/字段。
您可以使用IRequest
作为包含其中任何一个的内容的类型。当迭代可能包含来自任何一个数据的内容时,您可以检查每个对象是否实现了接口:
IRequest
答案 1 :(得分:2)
我遵循一般规则以避免创建基类,除非:
我已经设计或发现了足够的共性,为基类提供足够的实质内容。
我有一个用例来消耗类作为基类;如果我没有任何可以对类的通用功能进行操作的东西,那么拥有基类(通过实现常见行为的类的组合可以实现相同的功能)几乎没有价值。
要求足够稳定,我相信基类抽象将在未经重大修改的情况下保留。随着时间的推移,基类越来越难以修改。
答案 2 :(得分:2)
IMO,忘记数据库在一两分钟内的样子。
希望它有所帮助。
答案 3 :(得分:0)
嗯,我在这里做了一些假设,所以让我明白一下......
下式给出:
我会说继承不是我建模的方式。为什么?因为它是同一个对象,而不是两种不同的对象。你基本上只是没有显示几个字段,因此不需要查询它们。
所以,我可能会尝试完成一些能够明确两者之间差异性质的东西(请记住,我打算这样做以显示组织它的方式,以便明确,任何特定的实现可能有不同的需求;收集的主要思想是将差异视为它们的基础:根据某种条件查询的差异。
public enum EQueryMode
{
Manual,
Automatic
}
public class FieldSpecification
{
public string FieldName { get; set; }
public bool[] QueryInMode { get; set; }
public FieldSpecification
(
string parFieldName,
bool parQueryInManual,
bool parQueryInAutomatic
)
{
FieldName = parFieldName;
QueryInMode = new bool[] { parQueryInManual, parQueryInAutomatic };
}
}
public class SomeKindOfRecord
{
public List<FieldSpecification> FieldInfo =
new List<FieldSpecification>()
{
new FieldSpecification("Field1", true, true),
new FieldSpecification("Field2", true, false),
new FieldSpecification("Field3", true, true),
new FieldSpecification("Field4", true, false)
};
// ...
public void PerformQuery(EQueryMode QueryMode)
{
List<string> FieldsToSelect =
(
from f
in FieldInfo
where
f.QueryInMode[(int)QueryMode]
select
f.FieldName
)
.ToList();
Fetch(FieldsToSelect);
}
private void Fetch(List<string> Fields)
{
// SQL (or whatever) here
}
}
编辑:哇我今天似乎无法发表文章而不必更正我的语法! ;)