在某些情况下空 class 是正确的选择吗?

Could empty class be the right choice in some cases?

我有三个 classes ClassB 、 ClassC 和 ClassD 派生自 ClassA class (这是一个空 class)。

我根据对象的类型创建了一个名为 GetInformation 的[操作合同] WCF 服务,此方法的参数是复杂对象 ClassA。

当我调用 WCF 对象时,我通过三个 classes(ClassB、ClassC 或 ClassD)之一初始化 ClassA 对象。

我知道有一个空 class 通常是一个设计缺陷,但它是否是我的最佳选择,或者什么是这个场景的最佳设计?

ClassA 是一个空的超级 class 这是我的代码

[KnownType(typeof(ClassB))]
[KnownType(typeof(ClassC)))]
[KnownType(typeof(ClassD))]
[DataContract]
public class ClassA
{
}

ClassB 派生自 ClassA

[DataContract]
public class ClassB: ClassA
{
    [DataMember]
    public int num1{ set; get; }
}

ClassC 派生自 ClassA

[DataContract]
public class ClassC: ClassA
{
    [DataMember]
    public int num1{ set; get; }
    [DataMember]
    public int num2{ set; get; }
}

ClassD 派生自 ClassA

[DataContract]
public class ClassD: ClassA
{
    [DataMember]
    public string val1{ set; get; }
}

GetInformation return 基于对象类型的消息

[ServiceContract]
public interface IServices
{
    [OperationContract]
    string GetInformation(ClassA object);
}

您可以为您的 class 实现接口。为您写了什么 sjb-sjb。 但是我明白了,你使用 classes 没有任何通用方法,或者 属性。只有

public class ClassC: ClassA
{
    [DataMember]
    public int num1{ set; get; }
    [DataMember]
    public int num2{ set; get; }
}

[DataContract]
public class ClassB: ClassA
{
    [DataMember]
    public int num1{ set; get; }
}

你可以这样改写:

public class ClassC: ClassB
    { 
        [DataMember]
        public int num2{ set; get; }
    }

这可能是您设计应用程序时遇到的问题。 并尝试使用组合而不是继承或接口。为什么? 您可以在 post:

中阅读相关内容

https://softwareengineering.stackexchange.com/questions/260343/why-is-inheritance-generally-viewed-as-a-bad-thing-by-oop-proponents

或那里:

https://codeburst.io/inheritance-is-evil-stop-using-it-6c4f1caf5117

您不需要创建空 class。

作为三个 classes ClassBClassCClassD没有任何通用方法或属性。

因此您可以为每个class创建一个操作合约

[ServiceContract]
public interface IServices
{
    [OperationContract]
    string GetInformationB(ClassB objectB);

   [OperationContract]
    string GetInformationC(ClassC objectC);

   [OperationContract]
    string GetInformationD(ClassD objectD);
}