Стоит ли объявлять конструкторы абстрактного класса с модификатором доступа protected? - C#
Формулировка задачи:
1. Стоит ли объявлять конструкторы абстрактного класса с модификатором доступа protected? ReSharper подсказывает что стоит, не могу понять почему. Может по той же причине, что и поля?
2. Почему, когда я удаляю стандартный конструктор базового класса, в конструкторе Circle возникает ошибка?из -за того что он не ссылается на базовый?
3.В каком месте лучше объявлять переменные?
4. Можно как-то результат вывода сравнить в порядке убывания?или в данной программе это не возможно?
Буду благодарен за подсказки, советы, силки.
namespace ConsoleAp
{
internal abstract class Figure
{
protected double S;
public double A { get; set; }
protected Figure() { }
protected Figure(double a)
{
A = a;
}
public abstract void Area();
}
internal class Square : Figure
{
public Square(double a) : base(a) {}
public override void Area()
{
S = Math.Pow(A, 2);
Console.WriteLine("Площадь квадрата: {0}", S);
}
}
internal class Circle : Figure
{
private readonly double _r;
public Circle(double r)
{
_r = r;
}
public override void Area()
{
S = Math.PI*Math.Pow(_r, 2);
Console.WriteLine("Площадь круга: {0}", S);
}
}
internal class Rectangle : Figure
{
private readonly double _b;
public Rectangle(double b, double a)
: base(a)
{
_b = b;
}
public override void Area()
{
S = A*_b;
Console.WriteLine("Площадь прямоугольника: {0}", S);
}
}
internal class Program
{
static void Main()
{
Square s = new Square(10);
Circle c = new Circle(5.5);
Rectangle r = new Rectangle(5.5, 4);
s.Area();
c.Area();
r.Area();
}
}
}Решение задачи: «Стоит ли объявлять конструкторы абстрактного класса с модификатором доступа protected?»
textual
Листинг программы
namespace ConsoleAp
{
internal abstract class Figure
{
protected double S;
public double A { get; set; }
protected Figure() { }
protected Figure(double a)
{
A = a;
}
public abstract double Area(); // ~ теперь возвращает значение, без вывода
}
internal class Square : Figure
{
public Square(double a) : base(a) { }
public override double Area() // ~
{
S = Math.Pow(A, 2);
return S; // ~
}
}
internal class Circle : Figure
{
private readonly double _r;
public Circle(double r) : base(1)
{
_r = r;
}
public override double Area() // ~
{
S = Math.PI * Math.Pow(_r, 2);
return S; // ~
}
}
internal class Rectangle : Figure
{
private readonly double _b;
public Rectangle(double b, double a)
: base(a)
{
_b = b;
}
public override double Area() // ~
{
S = A * _b;
return S; // ~
}
}
internal class Program
{
static void Main()
{
Square s = new Square(10);
Circle c = new Circle(5.5);
Rectangle r = new Rectangle(5.5, 4);
double[] arr = new double[3]; // ~
arr[0] = s.Area(); // ~
arr[1] = c.Area(); // ~
arr[2] = r.Area(); // ~
Array.Sort(arr); // ~
// Вместо нижеизложенного можно делать реверс отсортированного массива и вывод через foreach
// либо вообще сделать по своему, без использования массива и прочего, обычным сравнением трёх значений.
for (int i = arr.Length - 1; i >= 0; i-- ) // ~
Console.Write(arr[i] + ", ");
Console.ReadKey();
}
}
}