31

一部の言語では、定数をインターフェイスに関連付けることができます。

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言語はありますか?
4

10 に答える 10

23

Get only プロパティを追加し、定義に const を付けてバックアップしました。

public interface IFoo
{
    string ConstValue { get; }
}

public class Foo : IFoo
{
    public string ConstValue => _constValue;
    private string _constValue = "My constant";
}
于 2018-04-06T11:35:24.670 に答える
20

3 番目の質問に答えるには:

C# はできませんが、インターフェイスに関連付けられた定数を定義できる別の .NET 言語はありますか?

C++/CLI を使用すると、インターフェイスで値を定義できます。これは、C# の値とliteral同等です。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 値のタイプは列挙型の方がよいでしょう。

于 2012-10-05T19:22:02.667 に答える
18

定数を格納する場所が必要な場合は、静的クラスを使用します。

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

それは(少なくとも1つの)一般的な標準です。

于 2012-10-05T18:56:23.773 に答える
7

C# ではインターフェイスに定数を使用できません。これは、定数は理論的には動作プロトコルのみを定義する型に属さない実装ファセットであるためです。

Java 関係者は、インターフェイスが何らかの抽象クラスとして内部的に扱われるか、列挙型などの型システムの欠陥を補うために必要なため、インターフェイスで const フィールドを許可しているのではないかと思います。

「DOMインターフェースの正規バインディング」の意味がわかりません。C# はブラウザーでは実行されません。

つまり、構造体や列挙型 (数値の場合) など、定数を別の場所に配置する必要があります。おそらく、ある種の命名規則に従うと役立ちます。インターフェイスが場合IFooBar、定数を含む構造体を呼び出すIFooSetttingsIFooValues、または適切なものを呼び出すことができます。

私は C# と VB.NET 以外の CLR 言語を知りませんが、VB ではこれが許可されていないことは確かです (かなり前のことですが)。

于 2012-10-05T19:02:20.260 に答える
1

抽象クラスは、インターフェイスが行うすべてのことを行い (typeof(T).IsInterfaceテストに合格することは別として)、定数を許可します。

インターフェイスに埋め込まれた定数 (または列挙型) に対する反論は見当違いです。ネーミングの問題です。意味のある非常に正確なコンテキストで定数に名前を付ける方が、コンテキスト外で名前を付けるよりも優れています。

于 2015-02-13T11:34:52.820 に答える
-1

メソッドのパラメーターや戻り値を考えて定義してみてください

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();
}
于 2016-05-25T08:23:31.600 に答える