2016-10-10 12 views
1

私はいくつかのタイプの "建物"のための一定の値の束を持っています、それらのサイズは固定されています(彼らが保持する3Dモデルのため)。C# - 定数フィールドを宣言しますが、インターフェイスで整理しますか?

基本クラス、インターフェイス、抄録について調べてみましたが、概念を完全に把握することはできませんでした。しかし、私はインターフェイスを使って共通のフィールドを持つクラスを「整理」するという考えが本当に好きでした。この場合、sizeXとsizeYは、すべてのビルディングクラスで共有されるフィールドのタイプです。

public static class BuildingProperties { 

public class House 
{ 
    public const int sizeX = 4; 
    public const int sizeY = 4; 
} 

public class House1 
{ 
    public const int sizeX = 6; 
    public const int sizeY = 6; 
} 

public class Commercial 
{ 
    public const int sizeX = 10; 
    public const int sizeY = 10; 
} 

} 

各クラスのコンストラクタを必要とせずに、このためのインターフェイスを実装する方法はありますか? (私は別のフィールドを追加する(例えば、「高さ」)を必要に応じて、そう:)

public void program() 
{ 
    int sizeX = BuildingProperties.House.sizeX; 
} 

し、将来の使用のためのように、私は、コンパイラをしたいと思い、必要に応じて単純にこれらの定数を呼びかけたいと思いますエラーをスローし、高さ 『値「ちょっと!あなたはHouse1を与えるために忘れてしまった』と言う!

このようなものは、誰かがあなたが単に2ゲッターを宣言するインターフェイスを作成することができますか?

+0

静的なサブクラス(例:ハウス)だけを宣言したらどうでしょうか? –

+0

私の前のコメントは、上記のプログラムの期待される構文を考慮しました。コンパイラーが 'House1の高さの値なし'というエラーをスローするには、インターフェースまたは基本クラスを作成し、それをモデルで継承する必要があります。その後、静的プロパティをコンストラクタでオーバーライドまたは指定することができないので、これらのクラスのインスタンスを初期化する必要があります –

+1

パブリックフィールドを使用しない - getterのみのプロパティを使用してください!インターフェースの中でそれらを使うこともできます。 – JeffRSon

答えて

3

あなたのコードにいくつかの再設計が必要なようです。私はあなたがなぜこれらのすべての公開サブクラスを持っていたいのか分かりません。代わりに、私は(常に同じ性質を持っているすべてを想定して)すべての建物タイプのための1つのクラスを使用すると、そのクラスの型のための3つのプロパティ:すべてのプロパティは、このサンプルコードでは不変であることを注意し

public class Building 
{ 
    public Building(int sizeX, int sizeY) 
    { 
     SizeX = sizeX; 
     SizeY = sizeY; 
    } 

    public int SizeX { get; } 
    public int SizeY { get; } 
} 

public static class BuildingProperties 
{ 

    public static Building House { get; } = new Building(4, 4); 

    public static Building House1 { get; } = new Building(6, 6); 

    public static Building Commercial { get; } = new Building(10, 10); 

} 

、および将来的にプロパティを追加して、それがなくなったときにコンパイラエラーを取得したい場合は、Buildingクラスのコンストラクタをこの新しいreadonlyプロパティの別のパラメータに変更するだけです。

+0

明らかに、OPは各クラスのコードベース全体を共有していないので、それらが 'const'の値以上に異なると想定するのは安全です – haim770

+0

@ haim770私はそれについてはあまりよく分かりません。コードの設計が貧弱になった結果、私はより多くの人に見えます。 –

+0

これは美しいです! –

1

に向けて私を指すことができることありますプロパティ:

public interface IProvideSizes 
{ 
    int SizeX { get; } 
    int SizeY { get; } 
} 

そして、あなたのクラスでそれらをあなたのconstからデータを返すがあります。

public class House : IProvideSizes 
{ 
    public const int _sizeX = 4; 
    public const int _sizeY = 4; 

    public int SizeX { get { return _sizeX; } } 
    public int SizeY { get { return _sizeY; } } 
} 

public class House1 : IProvideSizes 
{ 
    public const int _sizeX = 6; 
    public const int _sizeY = 6; 

    public int SizeX { get { return _sizeX; } } 
    public int SizeY { get { return _sizeY; } } 
} 

public class Commercial : IProvideSizes 
{ 
    public const int _sizeX = 10; 
    public const int _sizeY = 10; 

    public int SizeX { get { return _sizeX; } } 
    public int SizeY { get { return _sizeY; } } 
} 

あなたは、各タイプの契約を維持し、維持することができますこの方法では、まだ(静的な方法で、各タイプの特定のサイズにアクセスすることが可能でありながら、それをインスタンス化する必要はありません)。

-1

あなたは辞書を考えましたか?

  Dictionary<string, System.Drawing.Point> properties = new Dictionary<string, System.Drawing.Point>() { 
       {"House", new System.Drawing.Point(4,4)}, 
       {"House1", new System.Drawing.Point(6,6)}, 
       {"Commercial", new System.Drawing.Point(10,10)} 
      }; 
関連する問題