2017-01-26 11 views
-1

square継承クラスを作成しようとしています。これはpolygonベースクラスに依存しています。残念ながら、私の継承クラスにはエラーがあります。私はこの遺産に間違いがありますか?

これは私のpolygonクラスです:私のSquareクラスが対応していることを与えられた引数がありません。このエラー

を持って

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

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

と、これは私のSquareクラスですポリゴン(Polygon.Polygon)の必要な仮パラメータ 'numberofsides' (int) '

私はそれを解決する方法を理解していません。

+3

_complete_クラスを投稿してください。問題になっているコードが見当たりません。外部クラス 'SomeName {... members ...} 'を投稿してください。 –

+3

' Square'のコンストラクタは、その基底クラスのコンストラクタを呼び出さない – Jonesopolis

+1

はい、クラス定義を投稿してください。どちらも欠けています: 'Square'のものは' public class Square:Polygon {} 'でなければなりません。 –

答えて

1

ジョーンズポリス '答えはあなたのエラーを解決するための解決策です。

ただし、このように継承を使用しないでください。それは古典的な問題です:「四角形から四角形を継承するか、四角形から四角形を継承するべきか」という答えはどちらもありません。 (これは、ここで議論する:https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set

これは同じです。スクエアはポリゴンから継承してはいけません。誰かがPolygon型のオブジェクト(クラスインスタンス)を取得した場合、Squareへの制限は期待できないためです。

の代入はSがTのサブタイプがある場合は、コンピュータプログラムで、その後、 型Tのオブジェクトは、オブジェクトに置き換えてもよい、 を述べ、オブジェクト指向プログラミングの原則である:それはリスコフの置換原則に違反します Tのオブジェクトは、 Tの望ましい特性(正確性、実行されたタスク、 など)を変更することなく、サブタイプSの任意のオブジェクトで置き換えることができる。

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

4

あなたの正方形はPolygonから継承しますが、唯一のコンストラクタ(私は仮定)、あなたはそれをあなたがSquareを作成するたびに呼び出すことができるようにする必要がありPolygonがあります。そして、あなたに割り当てを除外することができ

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

SquareNumberOfSides、それはすでにそれが問題のように見えるPolygon

+0

ありがとう、先生は私に編集コードを教えてくれました。彼は私のPolygonクラスをこのように解決しました。しかし、私は理解していない、あなたは私のためにそれを説明することができますか? クラスPolygon { public int Numberofsides {get;セット; } public Polygon() { Numberofsides = 0; } 公開ポリゴン(int numberofsides) { Numberofsides = numberofsides; } } Numberofsides = 0の理由を教えてください。 –

1

ためにコンストラクタを介して、あなたに与えられますので、あなたのベースクラスは、ポリゴンは任意のパラメータなしのコンストラクタを持っていないということです。したがって、派生クラスのコンストラクタのパラメータを使用して、基本クラスのコンストラクタを呼び出す必要があります。

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に設定されているため、Squareクラスのコンストラクタで4に変更することができます。

+0

ありがとう、私の先生が私に編集コードをくれました。彼は私のPolygonクラスをこのように解決しました。しかし、私は理解していない、あなたは私のためにそれを説明することができますか? クラスPolygon { public int Numberofsides {get;セット; } public Polygon() { Numberofsides = 0; } 公開ポリゴン(int numberofsides) { Numberofsides = numberofsides; } } Numberofsides = 0の理由を教えてください。 –

+0

彼はNumberofsidesに価値を与えるためにそれをしました。そうすると、元のコードでそのコードを使用すると、値を受け入れないコンストラクタ(Numberofsidesを0に設定するコンストラクタ)が呼び出され、Numberofsides変数が初期化されます。 次に、Numberofsidesプロパティを、Squareコンストラクタで次のように設定します。 public Square(float size) { Size = size; Numberofsides = 4; } これは意味がありますか? – parameter

+0

しかし、私はそのコードを作るとき:public int Numberofsides {get; set} = 0、それは先生のコードと同じです。しかし、私のコードにはまだ問題があります。なぜそれが分かっていますか? –

1

派生コンストラクタの "float"パラメータを保持できる "Polygon"クラスには、基本(またはパラメータなし)コンストラクタはありません。解決するために

  • をパラメータなしを定義するか、ダミーの解決のためにポリゴン

または

  • にパラメータ化されたコンストラクタをフロートは

    上記のようにintにキャストしてみてくださいpublic Square(浮動小数点型):base((int)size)

+0

ありがとう、先生が私に編集コードをくれました。彼は私のPolygonクラスをこのように解決しました。しかし、私は理解していない、あなたは私のためにそれを説明することができますか? クラスPolygon { public int Numberofsides {get;セット; } public Polygon() { Numberofsides = 0; } 公開ポリゴン(int numberofsides) { Numberofsides = numberofsides; } } Numberofsides = 0の理由を教えてください。 –

+0

パラメータのないコンストラクタを定義し、プロパティの内部に何も配置しない(Numberofsides)。そのため、「Numberofsides」のデフォルト値は0です。 :) – rca

+0

また、他のクラス(ポリゴン)からクラス(シェイプ)を派生させ、その継承を呼び出します。したがって、 "Square p = new Square();"のような派生クラスからインスタンスをインスタンス化するときは、まず基本クラス(Polygon)コンストラクターが呼び出され、実際の派生クラス(Square)コンストラクターが呼び出されます。つまり、 ":base(X)"コードを使って、派生コンストラクター定義の基本コンストラクターに割り当てられた基本コンストラクターパラメーターを渡します。 – rca

関連する問題