C# 抽象类中没有公共成员

C# 抽象类中没有公共成员,c#,class,abstract-class,class-design,C#,Class,Abstract Class,Class Design,我正在构造一些与HTTP web服务交互的代码。要与它交互,您可以通过HTTPGET请求或HTTPPOST调用它上的“命令” 我想创建一个封装和隐藏HttpWebRequest对象的基类(例如ServiceCommand),但我不确信我希望它公开提供任何功能,只提供给子类 子类可以是(例如)SearchCommand或FetchCommand,它们将使用基类中受保护方法提供的功能 基本上,我的问题是:创建只有受保护成员而没有公共成员的类是否被认为是糟糕的设计。我在设计中问自己的一般问题: 这个

我正在构造一些与HTTP web服务交互的代码。要与它交互,您可以通过HTTPGET请求或HTTPPOST调用它上的“命令”

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

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


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

我在设计中问自己的一般问题:

  • 这个类是什么。记住,面向对象设计是关于对象的。如果您正在创建一个新对象,您需要能够将其视为一个单独的实体(至少是抽象的)。如果您只是提供功能,那么最好创建一个接口或扩展方法
  • 此功能是否已经存在?不需要创建一个类来包装一个运行良好的类
  • 最后,对于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; }
    }
    

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

这是一个关于“是a”和“有a”之间区别的问题

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

由于“Has A”,类B只想使用类A的实现,因此B将保留对A的引用,而不是从A继承


因此,就您的情况而言,这是一种“Has a”关系。

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