【问题标题】:No public members in abstract class抽象类中没有公共成员
【发布时间】:2014-03-20 21:08:04
【问题描述】:

我正在构建一些与 HTTP Web 服务交互的代码。要与之交互,您可以使用 HTTP GET 请求或 HTTP POST 在其上调用“命令”。

我想创建一个封装和隐藏 HttpWebRequest 对象的基类(例如,ServiceCommand),但我不相信我希望它公开提供任何功能,只提供给子类。

子类可以是(例如)SearchCommand 或 FetchCommand,它们将使用基类中受保护方法提供的功能。

基本上,我的问题是:创建只有受保护成员而没有公共成员的类是否被认为是糟糕的设计。

【问题讨论】:

  • 我会说使用它们并坚持 OOP 比不使用它们更好。
  • 如果您没有任何公共成员,您将如何调用实现的功能?构造函数?
  • 我不知道有什么理由不这样做,但是看到一个没有公共成员的班级似乎很奇怪。我在 .NET 框架中找不到任何这样的例子,这让我怀疑这是否是个好主意。
  • 没有可调用的公共功能。然而,该功能是所有子类的通用功能,这就是为什么它会有几个受保护的成员。
  • 这听起来不像is-a 关系,而是has auses。您是否考虑过将包装器移至单独的类并从XCommand 调用它,这看起来更像您的情况?如果您愿意,您仍然可以为所有命令类提供通用接口。

标签: c# class abstract-class class-design


【解决方案1】:

我对设计提出的一般性问题:

  • 这个类是什么。请记住,面向对象的设计是关于对象的。如果您正在创建一个新对象,您需要能够将其视为一个单独的实体(至少抽象地)。如果您只是提供功能,则最好创建一个接口或扩展方法。
  • 此功能是否已经存在?无需创建一个类来包装一个运行良好的类。
  • 最后是私有与公有 - 如果您认为子类需要访问基类值,请创建一个受保护的成员变量。无论您在基类中是否有公共属性,此变量都将起作用。一旦你这样做了——如果你认为这个值对外部有用,你可以在基类中添加一个 get/set。这最终看起来像:

    public abstract class BaseClass {
        protected object _member;
        public object MemberGet { return _member; }
    }
    
    public class InheritClass : BaseClass {
        // now the base class can "decide" to set the member or implement its own set rules
        public static void RoutineThatSetsMember(object value) { _member = value; }
    }
    

我不确定这些是否是每个人都使用的规则,但也许它会有助于总体设计(或者至少让对话继续进行)!

【讨论】:

    【解决方案2】:

    这是一个关于“Is A”和“Has A”之间区别的问题。

    关于“Is A”,如果类B继承自接口A或类A,则表示B是A的一种类型,B应该具有与A相同的行为,而这些行为是由公共成员函数定义的.

    由于“有A”,B类只是想使用A类的实现,所以B将持有A的引用,而不是从A继承。

    所以对于你的情况,这是一个“有 A”的关系。

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多