这个案例有意义 - 类vs界面vs抽象?

时间:2017-03-05 13:12:10

标签: c# oop

我有一个"包"数据库中的表。

一个包可以有三种类型:包A,包B和包C.

所有三个包都有一些常见的字段,如
1)名称
2)尺寸
3)重量

现在来到独特的领域:

套餐A& B必须包含 -
a)频道

包裹C必须包含 -
一)完成

所以,我创建了一个名为" Package"的表。在数据库中 "包"的列那就是:

1)ID
2)类型(1 = PackageA,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。

编辑:数据库部分怎么样?是否常见字段/列如" channel"(包A和B需要)(包C不需要)和"完成"(包C需要)(不是包A和B)需要" null"什么时候不需要/用于特定的包装类型?

1 个答案:

答案 0 :(得分:2)

这种方法唯一不对的是channelPackageA之间的PackageB重复。您可以通过为共享channel的两种包类型添加另一个基类来修复它:

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

这消除了Channel属性的重复。

对于数据库部分,有不同的方法将类层次结构映射到RDBMS,范围从属性值列表的单个表到具有类型字段的每个层次表。您选择了每个层次的表,这完全有效。