Дженерики C# и полиморфизм: оксюморон?

C# является хорошим ответом здесь - он имеет справедливую сборку "мусора" (хотя необходимо было бы представить его вполне немного - для изменения способа, которым Вы обрабатываете вещи теперь, когда вся обработка памяти вне Ваших рук), он прост в использовании, имейте много примеров, и хорошо документируется. В 3D отделе это оказывает полную поддержку для программ построения теней и эффектов и так - который был бы моим выбором.

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

18
задан Nick Swarr 29 November 2009 в 06:46
поделиться

3 ответа

As far as I can see, consuming code doesn't need specifics of generic class (i.e., it doesn't depends on what T is). So, why don't you introduce interface that SomeClass will implement, and use instance of this interface.

E.g.:

public interface ISome
{
    void SomeMethod();
}

public class SomeClass<T>: ISome
{
    public virtual void SomeMethod(){ }
}

public void DoSomethingClienty()
{
    Factory factory = new Factory();
    ISome someInstance = factory.Create();

    someInstance.SomeMethod();
}

Now, subclasses of SomeClass can operate differently on different Ts, but consuming code won't change.

13
ответ дан 30 November 2019 в 08:33
поделиться

Я думаю, вы неправильно понимаете смысл дженериков. Generics позволяет вам обобщить класс, которому требуется тип, но не особо заботится о том, какой это тип. Например, List - это список строк, но что будет за List ? Довольно бесполезно иметь список из ничего.

Каждый специализированный класс (например, List ) является собственным отдельным типом , и компилятор рассматривает его как такой. Возможно получить сам общий тип (например typeof (List <>) ), но в большинстве случаев это бесполезно, и вы, конечно, не можете создать экземпляр это.

9
ответ дан 30 November 2019 в 08:33
поделиться

I would prefer using abstract class to act as base of all generic types.

public abstract class SomeClass 
{
    public abstract void SomeMethod();
}

public class SomeClass<T> : SomeClass
{
    public override void SomeMethod() { }            
}

public class DeriveFrom<String> : SomeClass<String>
{
    public override void SomeMethod() { base.SomeMethod(); }            
}
2
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: