Проблема с конструктором в C#

238
09 января 2018, 11:45

Пишу реализацию списка:

using System;
using System.Collections.Generic;
namespace Lists
{
    /// <summary>
    /// Позволяет выводить на экран строковые представления объектов.
    /// </summary>
    public class Structure
    {
        /// <summary>
        /// Возвращает строковое предсталение объекта.
        /// </summary>
        /// <returns>string</returns>
        public string ToString(string s)
        {
            string result = String.Format("{0}: ", this.GetType().Name);
            var props = GetType().GetProperties();
            for(var i = 0; i < props.Length; i++)
            {
                if (i < props.Length - 1)
                {
                    result += String.Format("{0} = {1}, ", props[i].Name, props[i].GetValue(this));
                }
                else
                {
                    result += String.Format("{0} = {1}", props[i].Name, props[i].GetValue(this));
                }
            }
            return result;
        }
        /// <summary>
        /// Возвращает строковое предсталение объекта.
        /// </summary>
        /// <returns>string</returns>
        public override string ToString()
        {
            return ToString("");
        }
    }

    /// <summary>
    /// Узел списка.
    /// </summary>
    public class ListNode<Value> : Structure
    {
        /// <summary>
        /// Значение узла.
        /// </summary>
        public Value V { get; set; }
        /// <summary>
        /// Ссылка на следующий узел.
        /// </summary>
        public ListNode<Value> Next { get; set; }
        public ListNode(Value val)
        {
            V = val;
        }
        /// <summary>
        /// Выводит строковое представление объекта на экран.
        /// </summary>
        public void Print()
        {
            Console.WriteLine(ToString());
        }
        /// <summary>
        /// Выводит строковое представление объекта на экран и переходит на новую строку.
        /// </summary>
        public void Println()
        {
            Console.WriteLine(ToString());
        }
    }
    /// <summary>
    /// Узел, содержащий ссылку на предыдущий узел.
    /// </summary>
    public class ListNode2<Value> : ListNode<Value>
    {
        /// <summary>
        /// Предыдущий узел.
        /// </summary>
        public ListNode2<Value> Previous { get; set; }
        public ListNode2(Value val)
        {
            V = val;
        }
    }
    /// <summary>
    /// Базовый класс списков.
    /// </summary>
    public class BaseList<Value>
    {
        protected int _Count;
        /// <summary>
        /// Количество элементов списка.
        /// </summary>
        public int Count
        {
            get
            {
                return _Count;
            }
        }
        public BaseList()
        {
        }
    }
    /// <summary>
    /// Список.
    /// </summary>
    public class List<Value> : BaseList<Value>
    {
        private ListNode<Value> _Head;
        /// <summary>
        /// Голова списка.
        /// </summary>
        public ListNode<Value> Head
        {
            get
            {
                return _Head;
            }
        }
        public List()
        {
        }
        /// <summary>
        /// Возвращает строковое предсталение объекта.
        /// </summary>
        /// <returns>string</returns>
        public string ToString(string s)
        {
            string result = "";
            ListNode<Value> n = _Head;
            while (n != null)
            {
                result += n.ToString(s);
                n = n.Next;
            }
            return result;
        }
        /// <summary>
        /// Возвращает строковое предсталение объекта.
        /// </summary>
        /// <returns>string</returns>
        public string ToString()
        {
            return ToString("");
        }
        /// <summary>
        /// Выводит строковое представление объекта на экран.
        /// </summary>
        public void Print()
        {
            Console.WriteLine(ToString());
        }
        /// <summary>
        /// Выводит строковое представление объекта на экран и переходит на новую строку.
        /// </summary>
        public void Println()
        {
            Console.WriteLine(ToString());
        }
        /// <summary>
        /// Добавляет элемент в список.
        /// </summary>
        public void Add(ListNode<Value> node)
        {
            node.Next = _Head;
            _Head = node;
            _Count += 1;
        }
        /// <summary>
        /// Удаляет первый элемент списка.
        /// </summary>
        public void Remove()
        {
            if (_Head != null)
            {
                _Head = _Head.Next;
            }
        }
    }
}

Как исправить ошибку с конструктором в строке 92:

Lists.ListNode не содержит конструктор, который принимает 0 аргументов (CS1729) - C:\Ilya\AlgoРитмы\Задачи по программированию - AlgoРитмы [полностью проверено]\C#\Lists\Lists\MyClass.cs:92,10

?

Надо сделать так, чтобы на вход конструктора подавалось Value val, которое записывалось в свойство V.

Answer 1

Ошибка говорит о том, что у вас нет у класса ListNode конструктора без параметров. Если посмотреть конструктор класса ListNode2, то он неявно требует пустой конструктор без параметров для класса ListNode, так как ListNode2 является наследником ListNode и при объявлении конструктора опущено ключевое слово base.
Это значит при создании объекта-наследника будет вызываться пустой конструктор для создания базового объекта. Измените конструктор класса ListNode2 таким образом

        public ListNode2(Value val)
            : base(val)
        {
            V = val;
        }

Тем самым, вы явно вызываете нужный конструктор у базового класса с аргументом(а не пустой конструктор).

READ ALSO
Как работает || оператор в JavaScript [дубликат]

Как работает || оператор в JavaScript [дубликат]

На данный вопрос уже ответили:

239
Как написать правильно еxpression-bodied function member в SharpDevelop

Как написать правильно еxpression-bodied function member в SharpDevelop

Хочу написать второй метод ToString(Object obj) через лямбда выражение:

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

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

Хочу массиву кнопкам, из 10 кнопок передать в событие OnClick метод Appropriation(i), с аргументом i, который будет увеличиватьсяСуть: кнопка 1 имеет OnClick...

180
В чём разница между Convert.ToString, ToString и (String)?

В чём разница между Convert.ToString, ToString и (String)?

Например есть некая переменная:

254