Передача производного типа в качестве аргумента абстрактному классу

#c# #inheritance

#c# #наследование

Вопрос:

Мне было интересно, возможно ли реализовать аналогичную подпись для приведенного ниже кода на c#:

 public abstract class baseClass
{
    public abstract float function(derivedType a, derivedType b);
}

public class derived: baseClass
{
    public override float function(derived a, derived b)
    {
        return something to do with a and b;
    }
}
  

Надеюсь, из этого понятно, что я пытаюсь сделать, приветствия.

Редактировать: я безуспешно попробовал приведенное ниже, надеюсь, это также может прояснить, что я пытаюсь сделать:

 public abstract class baseClass
{
    public abstract float function<T>(T a, T b) where T:baseClass;
}

public class derived: baseClass
{
    public override float function<derived>(derived a, derived b)
    {
        return a.value   b.value;
    }

    public float value;
}
  

По-видимому, производный не содержит определения «значения» в соответствии с Visual Studio.

Редактировать, РЕШЕНИЕ:

 public abstract class baseClass<T> where T: baseClass<T>
{
    public abstract float function(T a, T b);
}

public class derived : baseClass<derived>
{
    public override float function(derived a, derived b)
    {
        return a.value   b.value;
    }

    public float value;
}
  

Спасибо всем за помощь 🙂

Комментарии:

1. Это непонятно. Что такое derivedType ?

2. Это любой тип, наследуемый от базового класса, в данном случае «производный» класс

3. Вы можете создать универсальный метод, в котором ограничение типа заключается в том, что T имеет тип baseClass : msdn.microsoft.com/en-us/library/d5x73970.aspx

4. Просто используйте baseClass в качестве типа аргумента

5. Оба хороших предложения см. В Моей правке. Использование базового класса в качестве типа аргументов не помогает, поскольку мне нужен доступ к методам внутри производного класса.

Ответ №1:

Если я правильно вас понимаю, что вы ищете, все, что вам нужно сделать, это:

 public abstract class baseClass<T> where T : baseClass<T>
{
    public abstract float Foo(T a, T b);
}

public class derived : baseClass<derived>
{
    public override float Foo(derived a, derived b)
    {
        throw new NotImplementedException();
    }

    public float value;
}
  

Комментарии:

1. зачем вам нужен универсальный тип <T> в сигнатуре метода?

2. Спасибо, ваш пост указал мне правильное направление, см. Мое решение в edit . Приветствия.

3. Хороший момент, что вы этого не делаете. Я работал с его кодом в качестве базового и не подумал удалить это. Он уже определен как уровень класса.