【问题标题】:Could empty class be the right choice in some cases?在某些情况下,空班是正确的选择吗?
【发布时间】:2019-07-13 15:05:20
【问题描述】:

我有三个类 ClassB , Cl​​assC 和 ClassD 都派生自 ClassA 类(这是一个空类)。

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

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

我知道有一个空类通常是一个设计缺陷,但在我的情况下它可能是最佳选择吗?或者什么是这个 scnario 的最佳设计?

ClassA 是一个空的超类 这是我的代码

[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 根据对象类型返回Message

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

【问题讨论】:

  • 这不仅是软件设计的反模式,当目标代表远程服务、WCF 或其他时,它尤其糟糕。你永远不知道什么是可接受的请求。不要在请求参数中使用多态性,因为它是一个失败的合同

标签: c# .net wcf oop


【解决方案1】:

你不需要创建空类。

ClassBClassCClassD这三个类没有任何共同的方法或属性。

因此您可以为每个类创建一个运营合同

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

   [OperationContract]
    string GetInformationC(ClassC objectC);

   [OperationContract]
    string GetInformationD(ClassD objectD);
}

【讨论】:

  • “没有任何共同的方法或属性” - 实际上证明ClassC 的活力可以通过一些重构从ClassB 继承
  • 但我还是没必要这样做,是吗。
【解决方案2】:

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

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; }
    }

在设计您的应用程序时可能会出现问题。 并尝试使用组合而不是继承或接口。为什么? 你可以在这篇文章中了解它:

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

【讨论】:

  • 要求是用一种查询方式实现WFC服务,客户端可以使用三种不同的方式查询,但它使相同的工作方式与不同的参数,例如可以使用id或name查询人员信息或者有时是生日。最好为每个参数做三个 [操作合同] 还是我创建的相同方式,考虑到方法做相同的工作但参数不同。
  • 对不起,我不太了解你,你说不同运营商的相同工作?
  • @MahmoudGamal 这不仅是软件设计的反模式,当目标代表远程服务、WCF 或其他时,它尤其糟糕。你永远不知道什么是可接受的请求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2019-08-09
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多