C# 空的抽象类/接口设计不好的标志?

C# 空的抽象类/接口设计不好的标志?,c#,.net,inheritance,architecture,C#,.net,Inheritance,Architecture,我的班级结构如下: 事实上,每个请求都没有共享任何内容,就像我处理请求时执行的typeof/cast一样。使用空根类的原因是为了在编译时限制可以传递给处理请求的方法的类: void ProcessRequest(Request request) 这个设计有缺陷吗?我觉得有一个空的根类/接口很奇怪。看看维基百科上的“”,它解释了这种方法的一些优点和缺点。这被称为标记接口 理想情况下,您应该删除运行时强制转换,并执行基于自然继承的解决方案。我想这是不可能的,否则你就不会问了 考虑到这一点,使用标

我的班级结构如下:

事实上,每个请求都没有共享任何内容,就像我处理请求时执行的
typeof
/
cast
一样。使用空根类的原因是为了在编译时限制可以传递给处理请求的方法的类:

void ProcessRequest(Request request)

这个设计有缺陷吗?我觉得有一个空的根类/接口很奇怪。

看看维基百科上的“”,它解释了这种方法的一些优点和缺点。

这被称为标记接口

理想情况下,您应该删除运行时强制转换,并执行基于自然继承的解决方案。我想这是不可能的,否则你就不会问了


考虑到这一点,使用标记接口比将所有内容都键入为
object
要好一点,因为它不太容易出现人为错误。这更像是自我记录,这很好。

在你澄清评论的帮助下,我会这样做。在这种情况下,我认为不需要空类。有些时候,使用内在性的“OO方式”做事情很简单,方法重载应该可以完成您所需要的。在我的示例中,泛型实际上可能太过分了,如果只对类型执行if/else,可以将
void进程(请求)
拆分为几个方法

public class RequestA
{
}

public class RequestB
{
}

public class RequestC
{
}

public class RequestProcesser :
    IProcessRequest<RequestA>,
    IProcessRequest<RequestB>,
    IProcessRequest<RequestC>
{
    public void Process<RequestA>(RequestA request)
    {
    }

    public void Process<RequestB>(RequestB request)
    {
    }

    public void Process<RequestC>(RequestC request)
    {
    }
}

public interface IProcessRequest<TRequest>
{
    void Process<TRequest>(TRequest request);
}
公共类请求a
{
}
公共类请求B
{
}
公共类请求
{
}
公共类请求处理程序:
我的请求,
我的请求,
IProcessRequest
{
公共作废流程(请求A请求)
{
}
公共作废流程(请求B请求)
{
}
公共作废流程(请求C请求)
{
}
}
公共接口IProcessRequest
{
作废流程(TRequest请求);
}

完全可以。但是不要做强制转换,在Request中创建一个方法:class Request{void Apply(ref to_what_type to_what){…}我认为你有一个方法处理不同类型的请求,这是一个更令人不安的迹象,可能是糟糕的设计。如果它们什么都不共享,为什么要使用相同的方法来处理它们呢?@Zache:它们是发送到通信系统的单个入口点的请求,在接收到请求后,该入口点将强制转换并发送到正确的类来处理它们。这就是为什么我们只有一个方法来接收请求。