2017-01-26 3 views
-1

Я пытаюсь создать класс наследования, который зависит от polygon базового класса. К сожалению, у моего класса наследования есть ошибка.Какая у меня ошибка в этом наследовании?

это мой polygon класс:

class Polygon 
{ 
    public int Numberofsides { get; set; }=0 
    public Polygon(int numberofsides) 
    { 
     Numberofsides = numberofsides; 
    } 
} 

и это мой Square класс:

class Square : Polygon 
{ 
    public float Size { get; set; } 
    public Square (float size) 
    { 
     Size = size; 
     Numberofsides = 4; 
    } 
} 

Мой Square класс имеет эту ошибку

нет ни одного аргумента, при условии, что соответствует к требуемому формальному параметру 'numberofsides' of 'Polygon.Polygon (int) '

Я не понимаю и знаю, как его решить.

+3

Опубликовать классы _complete_. В настоящее время отсутствует код. Поместить внешний 'class SomeName {... members ...}' –

+3

ваш конструктор для 'Квадрат' не вызывает его конструктор базового класса – Jonesopolis

+1

Да, опубликуйте определения классов. Оба они отсутствуют: один для 'Квадрат' должен быть' public class Square: Polygon {} ' –

ответ

1

Ответ Jonesopolis является решением проблемы с исправлением ошибки.

Однако вы не должны использовать наследование таким образом. Это классическая проблема: «Если Rectangle наследуется от Square или должен наследовать квадрат от Recangle». Ответ не является ни тем, ни другим. (Это, например,обсуждаемый здесь: https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set)

То же самое имеет место здесь. Ваш квадрат не должен наследоваться от Polygon. Потому что, если кто-то получает объект (экземпляр класса) типа Polygon, он не может ожидать ограничения на Square. Это нарушает принцип замещения Лисков:

подставляемость является принцип объектно-ориентированного программирования с указанием , что в компьютерной программе, если S является подтипом T, тогда объекты типа Т могут быть заменены на объекты типа S (т. е. объект типа T может быть заменен любым объектом подтипа S) без изменения любых желательных свойств T (правильность, выполненная задача, и т. д.).

https://en.wikipedia.org/wiki/Liskov_substitution_principle

4

Ваш квадрат наследуется от Polygon, но Polygon имеет только один конструктор (я предполагаю), и вы должны быть в состоянии назвать его каждый раз, когда вы создаете Square:

public Square (float size) : base(4) 
{ 
    Size = size; 
    //Numberofsides = 4; 
} 

Затем вы можете исключить присвоение NumberOfSides в Square, потому что уже будет дано вам через конструктор для Polygon

+0

спасибо, мой учитель дал мне отредактированный код. Он решил мой класс Polygon следующим образом. Но я не понимаю, вы можете объяснить это мне? класс Polygon { public int Numberofsides {get; задавать; } public Polygon() { Число номеров: 0; } public Polygon (int numberofsides) { Numberofsides = numberofsides; } } не могли бы вы мне объяснить, почему Numberofsides = 0 ?? –

1

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

class Polygon 
{ 
    public int Numberofsides { get; set; } 
    public Polygon() 
    { 
     Numberofsides = 0; 
    } 
    public Polygon(int numberofsides) 
    { 
     Numberofsides = numberofsides; 
    } 
} 
class Square : Polygon 
{ 
    public float Size { get; set; } 
    public Square (float size) 
    { 
     Size = size; 
     Numberofsides = 4; 
    } 
} 

Теперь ваш класс Polygon имеет конструктор по умолчанию, который не принимает никаких параметров. Таким образом, когда вы наследуете его в классе Square, изначально он устанавливается в 0, так что вы можете изменить его на 4 в конструкторе класса Square.

+0

спасибо, мой учитель дал мне отредактированный код. Он решил мой класс Polygon следующим образом. Но я не понимаю, вы можете объяснить это мне? класс Polygon { public int Numberofsides {get; задавать; } public Polygon() { Число номеров: 0; } public Polygon (int numberofsides) { Numberofsides = numberofsides; } } можете ли вы сказать мне, почему Numberofsides = 0 ?? –

+0

Он сделал это, чтобы дать Numberofsides значение. Таким образом, когда вы используете это со своим исходным кодом и вызывается конструктор, который не принимает никаких значений (тот, который устанавливает Numberofsides равным 0), и он инициализирует вашу переменную Numberofsides. Затем вы можете установить свойство Numberofsides в значение, которое вы хотите в квадратном конструкторе, например: public Square (поплавок) { Размер = размер; Numberofsides = 4; } Это имеет смысл? – parameter

+0

, но когда я делаю этот код: public int Numberofsides {get; set} = 0, это то же самое, что и код моего учителя. Но у моего кода все еще есть проблема. Вы знаете, почему это так? –

1

В классе «Polygon» нет базового (или без параметра) конструктора, который может удерживать параметр «float» производного конструктора.

Для решения:

  • Определить без параметров или поплавок параметризированный конструктор в Polygon

или

  • для фиктивного решения попробуйте бросить в целое, как выше

    public Square (размер поплавка): базовый ((int) размер)

+0

спасибо, мой учитель дал мне отредактированный код. Он решил мой класс Polygon следующим образом. Но я не понимаю, вы можете объяснить это мне? класс Polygon { public int Numberofsides {get; задавать; } public Polygon() { Число номеров: 0; } public Polygon (int numberofsides) { Numberofsides = numberofsides; } } можете ли вы сказать мне, почему Numberofsides = 0 ?? –

+0

Вы определили конструктор без параметров и никогда не назначали его внутреннюю часть для свойства (Numberofsides). Вот почему «Numberofsides» имеет 0 значение по умолчанию. :) – rca

+0

Также держите в уме, вы получили класс (Shape) из другого класса (Polygon), его вызывающее «наследование». поэтому, когда вы создаете экземпляр из производного класса, такого как «Square p = new Square()», сначала вызывается конструктор базового класса (Polygon), тогда вызывается ваш фактический конструктор производного класса (квадрат). Итак, что вы передаете через «: base (X)» код вашему базовому конструктору в определении производного конструктора, назначенный ему базовый конструктор paramater. – rca

Смежные вопросы