C #. Параметр параметра типа в общем интерфейсе должен быть типом класса, реализующего этот интерфейс [duplicate]

вы можете написать vbscript, чтобы создать экземпляр excel с помощью метода createobject (), затем откройте книгу и запустите макрос. Вы можете либо напрямую вызвать vbscript, либо вызвать vbscript из командного файла.

Вот ресурс, который я только что наткнулся: http://www.codeguru.com/forum/showthread. PHP? т = 376401

3
задан jameszhao00 11 June 2011 в 16:54
поделиться

5 ответов

Используемый вами шаблон фактически не реализует требуемое ограничение. Предположим, вы хотите смоделировать «животное может быть только дружественным с чем-то своего рода»:

abstract class Animal<T> where T : Animal<T>
{
    public abstract void GetFriendly(T t);
}

class Cat : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}

Удалось ли нам реализовать желаемое ограничение? Нет.

class EvilDog : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}

Теперь злая собака может быть дружелюбна с любым котом и не дружит с другими злыми собаками.

Ограничение типа, которое вы хотите, невозможно в C # система. Попробуйте Haskell, если вам нужно такое ограничение, которое применяется системой типов.

См. Мою статью по этому вопросу для более подробной информации:

http: //blogs.msdn. ком / б / ericlippert / архив / 2011/02/03 / страньше-и-curiouser.aspx

5
ответ дан Eric Lippert 18 August 2018 в 08:37
поделиться
  • 1
    Я думаю, что вы указываете важное ограничение, но в зависимости от реальных требований это может быть или не быть серьезной проблемой. Например, если это используется только в пределах собственной базы кода, это может быть стилистически очевидным, если шаблон выполняется правильно. – kvb 11 June 2011 в 00:31
  • 2
    Это интересно. Я совершенно не согласен. Существует простая резолюция к проблеме, которую вы воспринимаете с помощью этой техники. [Д0] blog.theobjectguy.com/2011/06/… – TheObjectGuy 22 June 2011 в 03:36

Не думаю, что вам нужно указать, где T: A.

T будет B, когда вы используете класс B: A

Это также известно как CRTP или любопытно повторяющийся шаблон шаблона и является известной идиомой.

0
ответ дан Andrei 18 August 2018 в 08:37
поделиться
1
ответ дан James Michael Hare 18 August 2018 в 08:37
поделиться

Мой последний вопрос был отмечен как дубликат этого. Я полностью согласен с этим. Поэтому я пришел сюда, чтобы взглянуть на ответы и прочитать пост Эрика (очень интересно). Вы не можете обеспечить это во время компиляции с помощью системы типов, но вы можете сделать это во время выполнения. Способ, которым я это реализовал, это:

abstract class FooBase<T>
{
    protected FooBase()
    {
        if (typeof(T) != GetType())
        {
            throw new InvalidOperationException();
        }
    }
}

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

0
ответ дан taquion 18 August 2018 в 08:37
поделиться

Поскольку A является абстрактным, вы можете добавить абстрактные методы в A и вызвать их из A и B, которые будут вынуждены реализовать метод, будет invoker:

abstract class A<T> where T:A
{
    public event Action<T> Event1;
    public abstract void Method();

    public A(){Method();}
}

class B : A<B>
{
    //has a field called Action<B> Event1;
    public void Method(){ //stuff }
}

При создании B, конструктор базового класса вызовет метод (), который реализуется только в B, заставляя экземпляр B быть вызванным.

Это позволяет A вызывать специальные методы подкласса, не требуя, чтобы A обладало конкретными знаниями о детях. Недостатком является то, что ВСЕ дети должны внедрять метод или повторно абстрагировать его на своих собственных детей.

0
ответ дан The Evil Greebo 18 August 2018 в 08:37
поделиться
Другие вопросы по тегам:

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