如何将常量与C#中的接口相关联?

有些语言允许您将常量与接口相关联:

  • 一个Java示例
  • 一个PhP的例子

W3C抽象接口也是如此,例如:

// Introduced in DOM Level 2: interface CSSValue { // UnitTypes const unsigned short CSS_INHERIT = 0; const unsigned short CSS_PRIMITIVE_VALUE = 1; const unsigned short CSS_VALUE_LIST = 2; const unsigned short CSS_CUSTOM = 3; attribute DOMString cssText; attribute unsigned short cssValueType; }; 

我想定义这个接口,以便可以从C#调用它。

显然,C#无法定义与接口关联的常量。

  • 将此类接口转换为C#的常用方法是什么?
  • 是否有任何针对DOM接口的“规范”C#绑定?
  • 虽然C#不能,是否有另一种.NET语言可以定义与接口相关的常量?

回答你的第三个问题:

虽然C#不能,是否有另一种.NET语言可以定义与接口相关的常量?

C ++ / CLI允许您在接口中定义literal值,这相当于C#中的static const值。

 public interface class ICSSValue { public: literal short CSS_INHERIT = 0; literal short CSS_PRIMITIVE_VALUE = 1; literal short CSS_VALUE_LIST = 2; literal short CSS_CSS_CUSTOM = 3; property DOMString^ cssText; property ushort cssValueType; } 

然后,您可以通过C#访问值:

 public static void Main() { short primitiveValue = ICSSValue.CSS_PRIMITIVE_VALUE; Debug.Assert(primitiveValue == 1); } 

有关详细信息,请参阅MSDN上的此页面 。

免责声明:禁止在接口中使用常量值的设计决策很好。 暴露实现细节的接口很可能是漏洞抽象。 在这个例子中,CSS Value Type可能更适合作为枚举。

如果你想要一个存储常量的地方,我会使用一个静态类:

 public static class MyConstants { public const int first = 1; public const int second = 2; public const string projectName = "Hello World"; } 

那是(至少一个)共同标准。

C#不允许接口中的常量,因为常量是一个实现方面,理论上它不属于只定义行为协议的类型。

我怀疑Java人员允许接口中的const字段,因为接口在内部被视为某种抽象类,或者因为他们需要它来弥补类型系统中的某些缺陷,如枚举。

我不确定“DOM接口的规范绑定”是什么意思。 C#不在浏览器中运行。

也就是说,你需要将常量放在其他地方,如结构或枚举(如果它们是数字)。 也许遵循某种命名约定会有所帮助 – 如果你的接口是IFooBar那么包含你的常量的结构可能被称为IFooSetttingsIFooValues或任何合适的。

我不知道除C#和VB.NET之外的任何CLR语言,但我很确定VB不允许这样做(尽管已经有一段时间了)。

我一直都在使用SO,但这是我在这里发表的第一篇文章。 我发现这篇文章,试图解决同样的问题。 当我看到使用静态类(由Servy)的post时,它让我想到通过将接口嵌入到静态类中来解决这个问题。

 // define an interface with static content public static class X { // define the interface to implement public interface Interface { string GetX(); } // static content available to all implementers of this interface public static string StandardFormat(object x) { return string.Format("Object = {0}", x.ToString()); } } // Implement the interface public class MyX : X.Interface { public override string ToString() { return "MyX"; } #region X.Interface Members public string GetX() { // use common code defined in the "interface" return X.StandardFormat(this); } #endregion } 

我添加了一个Get only属性,并在定义中使用const备份它。

 public interface IFoo { string ConstValue { get; } } public class Foo : IFoo { public string ConstValue => _constValue; private string _constValue = "My constant"; } 

一个抽象类将完成接口所做的一切(除了传递一个typeof(T).IsInterface测试)并允许常量。

嵌入在接口中的常量(或枚举)的异议是错误的。 这是一个命名问题。 在具有意义的非常精确的上下文中命名常量比在上下文中命名它们更好。

尝试定义思想方法参数和/或返回值

 public enum IFIleValue { F_OK = 0, F_WRONG_NAME = -1, F_ERROR_OBJECT_DATA = -2, }; public interface IFile { IFIleValue New(String Name=null); IFIleValue Open(String Path); IFIleValue Save(); IFIleValue SaveAs(String Path); IFIleValue Close(); }