#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.aspx4. Просто используйте
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. Хороший момент, что вы этого не делаете. Я работал с его кодом в качестве базового и не подумал удалить это. Он уже определен как уровень класса.