2017-03-05 58 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