2016-10-24 8 views
1

この質問は非常に一般的ですが、どのように実装するべきかわかりません。2つのクラス間で機能を共有する

私のシナリオ:

enter image description here

質問DirectionTileを実装する方法は? DirectionTile

行動の実装:(?)

abstract class DirectionTile 
{ 
    public Point Direction; 

    public Tile Next => Board.GetTile(Coords + Direction); 
} 

あなたはプロパティCoordsは、基底クラス、Tileあるからだろう見ることができるように。

RailTileSailTileはともにDirectionTilesです。 (本当にこのような多型を使用したい)SailTileWaterTileから継承する必要があり、これはTileと2人の関係をケースと同じようにしかし、私はちょうど、DirectionTileから継承することはできません。

私は誰かが私は解決できないことを、この問題で私を助けることができると思います。私の説明が十分明確であるかどうか教えてください。

+2

考えるとC#は何の多重継承を持っていない:DirectionTileについては
は、私はそれはあなただけのプロパティと機能を継承しWaterTileとRailTile

public abstract class Tile { private Point direction; public Point Direction { get { return direction; } set { direction = value; } } public abstract string someFunction(); } 

をインスタンス化します別のエンティティ/クラスだと思います特色 "、または次善策のオプション:拡張方法。 – CodeCaster

+0

戦略パターンが意味をなさないかもしれません。あなたのexecute()メソッドは単に "getNextTile()"オペレーションかもしれません。 – Tim

+2

[コンポーネントベースのゲームエンジン](http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/)を見てください。基本的には、tradidtional OOP継承を使用すると、あなたのようなアーキテクチャの問題を引き起こす可能性があることに重点を置いています。その代わりに、ゲームの各「オブジェクト」は、共通のルーツなしでコンポーネントの複数の組み合わせを可能にするコンポーネントの集約である可能性があります。 –

答えて

1

私が正しく理解していれば、DirectionTileは、エンティティによって実装される動作です。

単純に使用できるインターフェイスIDirectionTile、そしてあなたが拡張メソッドを提供することができ、複数の実装を防ぐために:

public interface IDirectionTile 
{ 

} 

public static class TileExtensions 
{ 
    public static void GetDirection(this IDirectionTile th) 
    { 

    } 

    public static void Next(this IDirectionTile th) 
    { 

    } 
} 
+0

これをこのように実装することができればすばらしいですが、 'Next()'メソッドから 'Tile'プロパティにアクセスする必要があります。これはこのようにはできません。 'Tile'と' IDirection'の間に醜いキャスティングが必要です。 – nkmol

+0

これらのプロパティは公開されていますか?もしそうなら、あなたが必要とし、キャストする必要がないプロパティを持つインターフェイスを作成してください –

0

はこのようにそれを実行してください:あなたの図のタイルから
ベースは、あなたの基本/親クラスと他のすべてのだろうクラスはその子クラスになります。タイルが持つプロパティと関数を継承します。 」を使用し、

public class WaterTile : Tile 
{ 
    //all property and functions now are accessible from the Tile base class 
    private string somevariable; 
    public string Somevariable 
    { 
    get{return somevariable;} 
    set{somevariable=value;} 
    } 
    public override string someFunction() 
    { 
     //return "something"; 
    } 
} 

public class SailTile : WaterTile 
    { //if there are additional properties/functions in your WaterTile it will be accessible by this class (SailTile) but not to other class 
     //in this case Somevariable is accessible in this class 
    } 
+0

私のポストの大きな文字をもう一度読む:) – nkmol

関連する問題