抽象类中没有公共成员

时间:2014-03-20 12:39:13

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

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

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

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

基本上,我的问题是:创建仅包含受保护成员但没有公共成员的类是否被视为不良设计。

2 个答案:

答案 0 :(得分:2)

一般问题我问自己设计:

  • 这门课程是什么?请记住,面向对象的设计是关于对象的。如果要创建新对象,则需要将其视为一个单独的实体(至少是抽象的)。如果您只是提供功能,那么最好创建一个接口或扩展方法。
  • 此功能是否已存在?无需创建一个类来包装一个运行良好的类。
  • 最后使用private与public - 如果您认为子类需要访问基类值,请创建受保护的成员变量。无论您是否在基类中拥有公共属性,此变量都将起作用。执行此操作后 - 如果您认为该值在外部有用,则可以在基类中添加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; }
    }
    

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

答案 1 :(得分:2)

这是一个关于"是A"之间区别的问题。和"有A"。

问候"是A",如果B类继承自接口A或A类,则意味着B是A的一种类型,B应该具有与A相同的行为,而这些行为是由公共成员函数定义。

As"有A",B类只想使用A类的实现,所以B将保留对A的引用,而不是继承自A。

所以对于你的情况来说,它是一个"有A"关系。