2017-03-05 57 views
4

我在数据库中有一个“包”表。这对这种情况是有道理的 - class vs interface vs abstract?

A包装可以是三种类型:包装A,包装B和C.包

所有三个包有一些共同的字段,如
1)名称
2)大小
3)重量

现在来到独特的领域:

套餐A & B必须包含 -
一)通道

套餐C必须包含 -
一)完成

所以,我创建了一个数据库称为“包”表。 “包” 的
列然后将是:

1)ID
2)类型(1 =程序包A,2 = PackageB,3 = PackageC)
3)名称
4)尺寸
5)重量
6)信道(不需要包C)
6)完成(不需要套餐A & B)

所以,我创建抽象类像下面(忽略的属性的数据类型):

public abstract class Package 
{ 
public id; 
public type; 
public name; 
public size;  
public weight; 
} 

public class PackageA : Package 
{ 
public channel; 
} 


public class PackageB : Package 
{ 
public channel; 
} 

public class PackageC : Package 
{ 
public completion; 
} 

我该怎么做这种做法的错误? Package类应该是抽象类还是简单类?
由于我不想让其他人直接在Package类上工作,而是采用Package A,B,C。

编辑:数据库部分呢? “通道”(对于包A & B需要)(不需要包C)和“完成”(包C需要)(包A & B不需要)具有“通道”的字段/列“何时不需要/用于特定的包装类型?

+1

你的做法是蛮好 – tony

回答

2

这种方法唯一的错误是channelPackageAPackageB重复。你可以通过添加另一个基类共享channel两种封装形式解决这个问题:

public abstract class PackageWithChannel : Package { 
    public Channel Channel {get;set;} 
} 
public class PackageA : PackageWithChannel { 
    ... 
} 
public class PackageB : PackageWithChannel { 
    ... 
} 

这消除了Channel属性的重复。

至于数据库的一部分,有一个映射类层次到RDBMS,范围从对于属性值列表的单一表以表每层次利用类型字段的不同方式。你选择了一个每层次的表,这是完全有效的。

+1

顺便说一句,我通常情况下,我不设计一个新的类单个共享属性的缘故。 –

+0

感谢您的建议家伙。 – wenn32

+0

我增加了一个编辑我原来的问题。 – wenn32