Как реализовать полиморфный интерфейс с универсальной пользовательской коллекцией - PullRequest
1 голос
/ 23 мая 2011

хорошо, поэтому я хочу сделать следующее: создать поли-интерфейс, используя универсальную коллекцию, которая принимает один из трех пользовательских типов (ограниченных через интерфейс).

Проблема возникает, когда янаписать реализацию для

public virtual CustCollection<CustType1> GetEntities()
{
    return new CustCollection<CustType1>();
}

, а затем попытаться переопределить ее на следующем уровне устаревания.Я даже не могу переопределить эту реализацию.

Другая возможность - использовать интерфейс, но тогда мне нужен интерфейс, чтобы принимать универсальный, а не указывать тип ... который я не могу получитьработает

то есть мне нужно:

interface IAccess<T>
{
    CustCollection<T> GetEntities();
}

но это не вариант, кажется ...

Есть предложения?

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Я правильно вас понял? :)

public interface IUnknown { }

public class SoAndSo : IUnknown { }

public class CustomCollection<IUnknown>
{
}

public class Ancestor<T> where T : IUnknown
{
    public virtual CustomCollection<T> GetEntities()
    {
        return null;
    }
}

public class Descender : Ancestor<SoAndSo>
{
    public override CustomCollection<SoAndSo> GetEntities()
    {
        return base.GetEntities();
    }
}
0 голосов
/ 24 мая 2011

В итоге я создал интерфейс (IAccess, как показано выше) и поместил ограничение типа на этот интерфейс ... затем использовал этот интерфейс для всех классов, взаимодействующих с рассматриваемыми типами.

так (извините, это высокий уровень, я не могу выписать мою фактическую реализацию)

interface IAccess<T> where T : ITypeInterface
{
    CustCollection<T> GetEntities(Filter filter);
}

Я попытался сделать то, что было предложено, но у меня есть цепочка из 3 классов, унаследованных, и были проблемы с самым верхним родителем, использующим предложенную модель.

Я оставил ограничение для пользовательской коллекции:

 public class CustCollection<T> : IEnumerable<T> where T : ITypeInterface
    {}

Это действительно сработало только для меня, потому что я понял, что мне на самом деле не нужно делиться функциональностью с родительскими классами (так что, в основном, не заканчивалось принудительным применением истинного полиморфизма ... только в смысле взаимодействия общих объектов функциональность ядра полностью индивидуальный).

Чтобы избежать затенения, я объявляю новый

  public new CustCollection<Type> GetEntities(Filter filter)
    {
        return new CustCollection<Type>();
    }

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

...