Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基类与实用类_C#_Java_Base_Derived - Fatal编程技术网

C# 基类与实用类

C# 基类与实用类,c#,java,base,derived,C#,Java,Base,Derived,两者中哪一个应该优先 有一些方法是由类A、B和C调用的 这些方法是否应该封装在类D(a、B和C的基)中 或 如果这些方法被封装在一个类U中,那么其他类就会创建它的对象来根据需要使用这些方法 在什么基础上作出决定 谢谢 您应该创建一个静态实用程序类 如果A,B和C实际上是AD,除非存在明显的is-A关系,否则我会倾向于放弃继承。根据你上面的描述,我怀疑情况并非如此。我的首选解决方案是: 将实用程序类的实例注入到a、B、C中 让A、B、C实例化适当的实用程序类 注入类的优点是,您可以简单地提供不同的

两者中哪一个应该优先

有一些方法是由类A、B和C调用的

这些方法是否应该封装在类D(a、B和C的基)中

如果这些方法被封装在一个类U中,那么其他类就会创建它的对象来根据需要使用这些方法

在什么基础上作出决定


谢谢

您应该创建一个
静态
实用程序类


如果
A
B
C
实际上是A
D
,除非存在明显的is-A关系,否则我会倾向于放弃继承。根据你上面的描述,我怀疑情况并非如此。我的首选解决方案是:

  • 将实用程序类的实例注入到a、B、C中
  • 让A、B、C实例化适当的实用程序类

  • 注入类的优点是,您可以简单地提供不同的实现。这对于测试特别有用。具有静态方法的单例或类往往会出于同样的原因导致问题——您不能轻易地重写或替换它们

    我会根据方法所做的决定,如果它们所做的事情特定于类A、B和C,那么它们应该在基类中。这有助于保持代码干净,因为它将与类相关的功能隐藏在系统的其他部分之外。(当然,我假设A、B和C要么已经从D继承,要么显然是相关的)

    如果他们在做其他类型的事情,这不是A、B和C所固有的,那么为了最大化重用机会,他们应该在实用程序类中


    如果他们使用与其他类型相关的其他类型(例如,漂亮地打印一个DATE),考虑将它们扩展为该类型的扩展方法。

    <强>使用基类< /强> 如果只根据基类编写一些逻辑,那么创建基类是有意义的。在这种情况下,派生类应该完全可以替代基类。不应该有任何开关逻辑来检查派生类型并相应地执行操作。参见Liskov替代原则:

    使用实用程序类 有些语言有不支持多重继承的限制。如果您已经有了一个有意义的基类,那么您需要使用utility类。此外,当您使用继承时,您正在创建从dervied类到基类的紧密耦合


    如果派生类可以自然地替换它的基类,我会选择基类。如果目的只是在类之间共享一些可重用的代码,那么使用实用类就更有意义。

    类A、B和C之间是否存在概念关系?制作一个接口并通过A、B、C实现如何?@p:只是它们构造类D使用的数据。A需要与其他类不同的输入@斯里尼瓦斯:这些方法的实现对于A、B和C来说是完全相同的。D有调用三种类型的算法的方法。A、 B和C构造特定于算法的数据,并调用这些常用方法来执行。@Azo:Detail总是有帮助的。在这种情况下,也许您应该使用继承,使用由
    A
    B
    C
    覆盖的
    abstract
    方法。我完全同意您的第二点,但我只建议在实用程序方法没有状态(即没有静态变量)的情况下使用静态实用程序类并且不执行有副作用的操作(文件IO或数据库活动等)。如果您正在对A、B和C进行单元测试,那么(几乎)不可能将它们与具有模拟对象的静态实用程序类解耦。最好使用通过构造函数注入传递给a/B/C的非静态实用程序类。然后,您的代码是高度可配置的,并通过聚合获得行为。@Azodius-看看策略设计模式()。您有一个抽象的基类和自定义算法的子类。听起来正是你需要的。@Xcal:你说得对,但你对他的代码库的质量做出了不合理的假设。+1:你比我强。正如SLaks提到的,OP似乎也不知道静态函数。也许值得一提的是,对于实用程序类也是如此。