【问题标题】:A better name for INeedSomething...?INeedSomething 的更好名称...?
【发布时间】:2011-05-09 07:34:49
【问题描述】:

我正在尝试为一个接口取一个名字,通过它我可以将一些东西传递给一个对象,比如:

  • 如果对象是 INeedX,则调用 SetX(some x) 方法;
  • 如果对象是 INeedY,则调用 SetY(some y) 方法;
  • 等等。 (很有趣,我知道 :))

我尝试为此类接口找到一个不同的名称,但我无法弄清楚。

有人知道如何命名 INeedSomething 接口吗?

【问题讨论】:

  • 所有类都需要它们的基类和它们实现的接口。你的问题很模糊,举个例子吧。
  • 接口的名称应该描述对象可以执行的能力或功能,而不是它需要什么数据的细节。那是一个实现细节,与接口名称无关。
  • 这听起来不像是一个界面。而且你很难命名它的事实也可能表明你选择了错误的工具来完成这项工作。您能否详细说明这试图为您解决什么问题?另外,如果这只是一个命名问题,你能发布使用它的实际代码吗(暂时坚持使用 INeedSomething)?

标签: c# interface naming-conventions class-design naming


【解决方案1】:

您的界面的名称 IDependsOn 怎么样(又名 IDependsOnUserId、IDependsOnTimeOut)

【讨论】:

    【解决方案2】:

    嗯,INeed 界面可能表明设计很尴尬。在我看来,您真正要寻找的是依赖注入,它相当于说明一个对象需要另一个对象才能运行的代码。所以不要有

    class Car:INeed<Engine> {
        public Set(Engine engine)
    }
    

    ,也许你真正想要的是

    class Car {
        public Car(Engine engine)
    }
    

    如果我是你,我会尝试看看上述内容是否适用于你的情况,这是一种更标准的声明需求/依赖关系的方式

    【讨论】:

    • 我同意,但是,如果无法进行构造函数注入,则可以使用属性注入。
    【解决方案3】:
    public interface INeed<T>
    {
       public T SetValue { set; }
    }
    

    通过使用泛型,你的接口传递的类型稍后定义,如下所示:

    class Needy : INeed<int>
    {
       private int internalValue;
       public int SetValue { set {
         internalValue = value;
       } };
    }
    

    【讨论】:

    • 我不是指 INeedSomething 的实现,并且实现不能是通用的,因为相同的类型可能意味着很多东西,例如:INeed 可能意味着 INeedUserId、INeedTimeout 或其他可以是 int 的值。
    • 如果你有这样的课程,这将不起作用:class Needy : INeed&lt;int&gt;, INeed&lt;string&gt;。实际上,如果您明确定义成员并将它们包装在每个类的公共属性中,这可以工作。使用带有类变量声明或接口变量声明的类时可能会有点奇怪
    【解决方案4】:

    IRequire 听起来更好,但是,为此使用接口似乎是错误的。

    改用属性:

    class MyClass
    {
        [Required]
        double X
        {
             get;
             set;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多