这种情况下使用 class vs interface vs abstract,哪个更合适?

4
我在数据库中有一个“包”表。
一个包可以是三种类型之一:包A,包B和包C。
这三个包都有一些共同的字段,如:
1)名称
2)尺寸
3)重量
现在来看看独特的字段:
包A和B必须包含:
a)渠道
包C必须包含:
a)完成
因此,我在数据库中创建了一个名为“Package”的表。
然后,“Package”的列将是:
1)id
2)type(1 = PackageA,2 = PackageB,3 = PackageC)
3)名称
4)大小
5)重量
6)渠道(对于Package C不需要)
7)完成(对于Package 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”(适用于Package A和B)(对于Package C无需)和“completion”(对于Package C有必要)(对于Package A和B无需)这样的字段/列在不需要/不适用于特定的包类型时是否可以为“null”?

1
你的方法很好。 - nick
1个回答

2
唯一的问题在于这种方法中channelPackageAPackageB中重复。您可以通过为共享channel的两种包类型添加另一个基类来解决此问题。
public abstract class PackageWithChannel : Package {
    public Channel Channel {get;set;}
}
public class PackageA : PackageWithChannel {
   ...
}
public class PackageB : PackageWithChannel {
   ...
}

这样可以避免Channel属性的重复。

至于数据库部分,将类层次结构映射到关系型数据库有不同的方法,从属性-值列表的单个表到带有类型字段的层次结构表。您选择了层次结构表,这是完全有效的。


1
顺便提一下,在我的情况下,通常我不会为了一个单独的共享属性而设计一个新类。 - Matías Fidemraizer
我已经在我的原始问题中添加了一个编辑。 - wenn32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接