Вложенный интерфейс не вызывает дочерний метод, если возврат имеет тип TC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вложенный интерфейс не вызывает дочерний метод, если возврат имеет тип T

Сообщение Anonymous »

Я пытался поближе познакомиться с интерфейсами и подумал, что было бы здорово использовать вложенные интерфейсы для разделения частей логики, поэтому у меня есть следующие интерфейсы:

Код: Выделить всё

public interface ISortedGroupWithMover: ISortedGroup

Код: Выделить всё

public interface ISortedGroup : IGroup

Код: Выделить всё

public interface IGroup

Код: Выделить всё

public interface IMoveableHoldee : IHoldee, IHoldeeMovements

Код: Выделить всё

public interface IHoldeeMovements

Код: Выделить всё

public interface IHoldee
Итак, это были интерфейсы, которые я придумал, по сути это два интерфейса, которые немного более многоуровневые.
Первый из них — группа. -> отсортированная группа -> sortedgroupmover
второй — Holdee -> moveableHoldee (это Holdee, который может использовать движения)
в общем это вроде сработало, и я имею в виду, что большую часть этого я мог бы вставить, например тот же интерфейс, но я хотел немного поиграть и подумал, что было бы лучше, если бы разные части логики были разделены.
Теперь возникла следующая проблема:
У меня есть класс:

Код: Выделить всё

public class CardDeck : MonoBehaviour, ISortedGroupWithMover
Основная идея состоит в том, чтобы создать колоду, которая представляет собой группу сортировки с элементами, которые могут перемещаться.
она реализует:

Код: Выделить всё

(from: public interface IGroup)
public List GetHoldees();
как

Код: Выделить всё

public List GetHoldees() => _cards;

Код: Выделить всё

var deck = DealDeck().GetHoldees().First().IHoldee.GetGameObject().name;
это немного сложновато, но это (Iholdee — это просто выбранный класс) возвращает правильную карту в колоде и действительно работает
однако проблема возникает, когда я пытаюсь использовать этот метод

Код: Выделить всё

(from:     public interface ISortedGroup : IGroup)
public T TopHoldee() => GetHoldees().First();
теперь это метод, у которого есть тело, которое может быть еще одной причиной неправильного поведения
На самом деле странно то, что этот метод НИКОГДА не запускается , даже если я вызову его и помещу вывод в тело метода, он НЕ будет напечатан
Теперь, если я изменю этот метод следующим образом:

Код: Выделить всё

public void TopHoldee()
{
Debug.Log("TTEST: " + GetHoldees().First());
}
Это печатает правильный элемент
Это проект Unity, так что это тоже может иметь к нему какое-то отношение, но меня немного смущает этот факт что простое изменение типа может иметь такой эффект. Я также понятия не имею, почему это так, поэтому сообщите мне, в чем причина такого неожиданного поведения.
Примечание:

Код: Выделить всё

public abstract class ACardFather : MonoBehaviour, SortedUiObject, IMoveableHoldee
это класс cardfather

Код: Выделить всё

public interface IGroup
{
public RectTransform GetRect() => GetHolder().GetComponent();
public GameObject GetHolder();
public List GetHoldees();
}

Код: Выделить всё

public interface ISortedGroupWithMover:
ISortedGroup
{
bool IsMoving { get; set; }
void StartMoving() => IsMoving = true;
void EndMoving() => IsMoving = false;

bool IsBottomCollapsed();
bool IsTopCollapsed();
}

Код: Выделить всё

 public interface IMoveableHoldee : IHoldee,
IHoldeeMovements
{
IHoldee IHoldee => this;
IHoldee IMovements => this;
}

Код: Выделить всё

public interface ISortedGroup : IGroup
{
public int GetVerticalOffset();
public int GetHorizontalOffset();
public bool ExemptFirst();
public Vector3 GetOffset(int order)
{
...
}
private void ChangeOffsets(int order, MonoBehaviour obj)
{
...
}
private void ChangeSortingOrder(int order, SortedUiObject
sortedObj)
{...

}
private void ChangeSizes(MonoBehaviour card)
{
...
}
public IEnumerator MoveToStartingPos(float
duration,AnimationCurve curve)
{
...
}
public T TopHoldee() => GetHoldees().Last();
public T BottomHoldee() => GetHoldees().First();

}
Это должны быть все необходимые классы.
Изменить:
Я только что попробовал эту распечатку:

Код: Выделить всё

    Debug.Log("BottomItem is: " +d.BottomItem());
Debug.Log("TopItem is:" +d.TopItem());

для методов, установленных в:

Код: Выделить всё

        public T TopItem() => GetHoldees().First();
public T BottomItem() => GetHoldees().First();

Код: Выделить всё

        BottomItem is: System.Collections.Generic.List`1[DefaultNamespace.IMoveableHoldee`1[ACardFather]]

TopItem is:tmpdeck (UnityEngine.GameObject)
меня так смущает этот журнал отладки

Подробнее здесь: https://stackoverflow.com/questions/792 ... -of-type-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»