2016-10-24 5 views
1

Этот вопрос звучит очень часто, но я понятия не имею, как его реализовать.Поделиться функциональностью между двумя классами

Мой сценарий:

enter image description here

Вопрос: Как реализовать DirectionTile?

Поведение реализация DirectionTile:

abstract class DirectionTile 
{ 
    public Point Direction; 

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

Как вы можете видеть свойство Coords будет от базового класса, который является Tile (?).

Оба RailTile и SailTile являются DirectionTiles. Тем не менее, я не могу просто наследовать от DirectionTile, так как SailTile необходимо наследовать от WaterTile, и это приведет к 2 отношениям с Tile (действительно, нужно использовать такой полиморфизм).

Я надеюсь, что кто-то может помочь мне с этой проблемой, которую я не могу решить. Дайте мне знать, если мои объяснения достаточно ясны.

+2

Учитывая C# не имеет множественное наследование, использование " черты "или следующий лучший вариант: методы расширения. – CodeCaster

+0

Стратегия может иметь смысл. Ваш метод execute() может быть просто «getNextTile()». – Tim

+2

Вы должны взглянуть на [Компонентный движок игры] (http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/). В основном это подчеркивает, что использование традиционного наследования ООП может вызвать проблему архитектуры, например вашу. Вместо этого каждый «объект» в игре может представлять собой совокупность компонентов, позволяющих использовать кратные комбинации компонентов без общих корней. –

ответ

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

Было бы здорово, если бы я мог реализовать его так, но мне все же требуется, чтобы я получил доступ к свойствам 'Tile' из метода' Next() ', что невозможно. Это потребует уродливых отливок между 'Tile' и' IDirection'. – nkmol

+0

Эти объекты общедоступны? Если это так, то создайте интерфейс с нужным вам свойством и не нужно бросать –

0

Делают это так:
Base от вашей диаграммы плитки будет ваша база/родительский класс и все остальные классы будут его дочерним классом. который затем наследует свойство и функции (ы), которые имеет Плитка.
Для DirectionTile я думаю, что это отдельный объект/класс, где вы просто экземпляр WaterTile и RailTile

public abstract class Tile 
{ 
    private Point direction; 

    public Point Direction 
    { 
     get { return direction; } 
     set { direction = value; } 
    } 

    public abstract string someFunction(); 
} 

Теперь наследовать имущество и функции:

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