Общее наследование - PullRequest
0 голосов
/ 30 мая 2011

У меня есть пара вопросов о моем понимании области .NET.

Пожалуйста, рассмотрите следующий макет:

interface IListInterface<T>
{
    //brevity
}

interface IClassInterface
{
    int Count { get; }
}

class A<T> : IClassInterface
{
    List<IListInterface<T>> MyList = new List<IListInterface<T>>();
    public virtual int Count { get { return MyList.Count; } }
    public void Add(IListInterface<T> item) { MyList.Add(item); }
    public IEnumerable<String> GetAllAsString(T source) { return MyList.Select(o=>o.ToString()); }
}

class B<T1, T2> : A<T1>
{
    List<IListInterface<T2>> MyList = new List<IListInterface<T2>>();
    public override int Count { get { return base.Count + MyList.Count; } }
    public void Add(IListInterface<T2> item) { MyList.Add(item); }
    public IEnumerable<String> GetAllAsString(T1 source1, T2 source2)
    {
        return base.GetAllAsString(source1).Union(MyList.Select(o => o.ToString()));
    }
}

class C<T1, T2, T3> : B<T1, T2>
{
    List<IListInterface<T3>> MyList = new List<IListInterface<T3>>();
    public override int Count { get { return base.Count + MyList.Count; } }
    public void Add(IListInterface<T3> item) { MyList.Add(item); }
    public IEnumerable<String> GetAllAsString(T1 source1, T2 source2, T3 source3)
    {
        return base.GetAllAsString(source1, source2).Union(MyList.Select(o => o.ToString()));
    }
}

Мои вопросы:

  1. Какой термин используется для описания того, что делают класс B и класс C? Наследование перегрузок общего типа ?

  2. При написании такого объекта, как правило, много повторяющегося кода, особенно при добавлении большего количества методов, которые в конечном итоге просто вызывают его базу, и добавляют свою собственную информацию к возвращаемому объекту. Есть ли лучший способ сделать это, чтобы обеспечить более поддерживаемый файл класса?

Отредактировано с учетом необходимости использования этого метода

Используя этот тип наследования, можно определить один объект, который будет ограничивать требования к вводу данных и объяснять его использование.

var x = new C<String, int, DateTime>();

Теперь вы знаете типы, из которых состоит объект, и вы получите ошибку во время компиляции, если попытаетесь вызвать x.GetAllAsString(0, "hello", "world");

Этот тип объекта может не работать для вас, и его пригодность для использования не является предметом моего вопроса. Мои вопросы касаются названия этого метода и повторного использования кода в этой ситуации.

1 Ответ

0 голосов
/ 18 апреля 2012

[Для краткости; в целях моего ответа я сосредоточусь только на методе «Добавить», поскольку вопрос / решение относится ко всей вашей модели]

К сожалению, я не верю, что вы можете упростить то, что вы уже реализовали. По сути, вы намереваетесь ограничить тип ('C') во время выполнения набором доступных типов, что (если бы оно работало!) Дало бы вам ограниченное подмножество Add / Методы GetAllAsString.

Итак, после прохождения компилятора кажется, что вы надеетесь превратить одиночный класс с помощью одного метода, например;

public class Base<T>
{ 
    Add(IListInterface<T> o);
}

в объект времени выполнения, который предоставляет интерфейс, подобный;

public class C
{
    Add(IListInterface<string> o) { ... }
    Add(IListInterface<DateTime> o) { ... }
    Add(IListInterface<int> o) { ... }
}

Но вы не можете использовать дженерики таким образом. Единственный способ действительно достичь этого - подойти к этому так, как вы; со стеком производных типов, каждый из которых добавляет к вашему типу другой ограниченный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...