3

ポリモーフィズムの例を試していましたが、コードで次のエラーが発生しました:

public class CPolygon 
{
    CPolygon() {} 
    public int width {get; set;} 
    public int height {get; set;}        
    public virtual int area(){ return 0; } 
}

class CRectangle: CPolygon 
{ 
    public CRectangle() {} //'Lista.CPolygon.CPolygon()' is inaccessible due to its protection level

    public override int area ()
    { 
        return (width * height); 
    }
}

class CTriangle: CPolygon //'Lista.CPolygon.CPolygon()' is inaccessible due to its protection level
{
    CTriangle() {} 

    public override int area ()
    { 
        return (width * height / 2); 
    }
}

static void Main(string[] args)
{
    CTriangle triangle= new CTriangle();
    triangle.height=5;
    triangle.width=6;
    int area1 = triangle.area();
}

派生クラスのコンストラクターが「保護レベルのためにアクセスできません」というエラーが表示されます。理由がわかりません。動作する暗黙の派生コンストラクターを使用して別の例を実行しました。

abstract class Shape
{
    public Shape(string name = "NoName")
    { PetName = name; }
    public string PetName { get; set; }
    public abstract void Draw();
}

class Circle : Shape
{
    public Circle() {}
    public Circle(string name) : base(name) {}
    public override void Draw()
    {
    Console.WriteLine("Drawing {0} the Circle", PetName);
    }
}

class Hexagon : Shape
{
    public Hexagon() {}
    public Hexagon(string name) : base(name) {}
    public override void Draw()
    {
    Console.WriteLine("Drawing {0} the Hexagon", PetName);
    }
}

これは機能し、コードはほぼ同じです。コンストラクタ "Circle()" 、 "Hexagon()" は、今回は保護レベルを必要としません。何か案は?

4

3 に答える 3

6
CPolygon() {} 

それがprivateコンストラクタです。
クラスの外で呼び出すことはできません。

派生クラスは常に基底クラスからコンストラクターを呼び出す必要があるため、エラーが発生します。

于 2012-10-15T16:30:03.377 に答える
4

C#のデフォルトのシンボルの可視性はプライベートです。クラスまたは関数の定義の前に「public」を付けないと、プライベートな可視性があります。つまり、他のクラスはそのシンボルを見ることができません。

于 2012-10-15T16:32:01.517 に答える
0

クラスCPolygonはパブリックですが、CRectangleとCTriangleの保護レベルを定義していません。2つの派生クラスをパブリックにすると、エラーが発生しますか?

于 2012-10-15T16:33:01.297 に答える