class Number : Addable
{
public int Value;
public Number(int Val)
{
Value = Val;
}
public Number Add(Number X, Number Y)
{
return new Number(X.Value + Y.Value);
}
}
должно быть
class Number : Addable
{
public int Value;
public Number(int Val)
{
Value = Val;
}
public override Number Add(Addable X, Addable Y)
{
return new Number(X.Value + Y.Value);
}
}
Когда вы объявляете абстрактный метод, вам нужно реализовать его в точности так, как он был объявлен, иначе он не будет компилироваться.Но не волнуйтесь, поскольку ваш Number
класс является производным от Addable
, вы все равно можете вызывать метод без приведения.
EDIT:
Оглядываясь назадв коде многое можно улучшить здесь.
Например, вы выставляете переменную (Value) - это противоречит законам инкапсуляции (OOP).Я бы предложил использовать свойство в этом случае.Кроме того, как уже упоминалось в комментариях (я упустил этот факт), свойство должно идти в вашем базовом классе.
Говоря о базовом классе, в этом случае было бы целесообразно включить это винтерфейсу, поскольку вы ничего не реализуете, а только декларируете.
Используйте интерфейс, когда хотите раскрыть план чего-либо.Используйте абстрактный класс, когда хотите раскрыть рамки чего-либо.
По сути, вы можете придумать интерфейс, подобный плану здания (чертежу) дома.Он объявляет структуру указанного дома.Думайте об абстрактном классе как о каркасе дома.Он еще не закончен, но вы можете стоять внутри стен и быть сухим - АКА, он уже предоставляет некоторые функциональные возможности.
Вот идея, как решить вашу проблему.Это не самое элегантное, но оно должно дать вам общее представление.
На самом деле, после того, как это записано, пришло в голову гораздо более изящное решение: использование структур.
public interface IAddable {
/// <summary >
/// This is the value we want.
/// </summary>
int Value { get; set; }
IAddable Add(IAddable x, IAddable y);
}
public class Number : IAddable {
public Number() { }
public Number(int num) => Value = num;
public int Value { get; set; }
public IAddable Add(IAddable x, IAddable y) {
return (Number)(x.Value + y.Value);
}
public static implicit operator Number(int num) => new Number(num);
public static implicit operator Number(double num) => new Number((int)num);
public static implicit operator int(Number num) => num.Value;
}
РЕДАКТИРОВАТЬ 2
Как уже упоминали другие в своих ответах, вы также можете использовать дженерики для учета большего количества типов данных.Неявные операторы (как в моем примере) , а не , обязательно лучший вариант для использования, особенно если вы только начинаете изучать язык.