У меня один интерфейс: IShape2D, с такими методами, как Area (), Perimeter () и т. Д.
У меня также есть два класса: Rectangle и Circle.
Оба эти класса реализуют IShape2D. Но они также имеют местные свойства в зависимости от их формы. Например, у Rectangle есть ширина и глубина, тогда как у Circle есть только диаметр.
Я пытаюсь передать (используя полиморфизм) экземпляры объекта Rectangle или Circle другому конструктору класса, чтобы я мог получить доступ к их методам.
Конструктор класса ожидает следующего: ClassA (IShape2D _2dObject) Я могу без проблем использовать Area (), Perimeter (), поскольку в IShape2D есть метод, который реализуют обе подформы.
Моя проблема: я хочу получить доступ к локальным свойствам этих фигур, чтобы независимо от того, был ли передан Круг или Прямоугольник, я мог запросить ширину и глубину ИЛИ диаметр.
Я понимаю, что янужно добавить еще один метод в интерфейс, что-то вроде GetDimensions (). Тем не менее, Rectangle будет возвращать 2 значения (ширина, глубина - оба типа double), в то время как Circle будет возвращать только 1 (диаметр).
Я не могу понять, как определить тип возврата метода интерфейса в подписитак что я обе подформы можем реализовать один метод, но вернуть их соответствующие свойства.
Я пробовал различные подходы, чтобы приспособить возвращение различного количества аргументов из двух разных подформ.
Лучшим подходом, который я думал, было бы возвращение ValueTuple в сигнатуре интерфейса, но мне нужно было бы указать количество возвращаемых аргументов в сигнатуре, которое для прямоугольника было бы ValueTuple (double, double) идля круга будет ValueTuple (double).
//Start of interface.
public interface IShape2D {
double Area;
double Perimeter;
ValueTuple<double, double> getDimensions();
}
//Start of rectangle class.
public class Rectangle : IShape2D
{
public double Width {get; set;}
public double Depth {get; set;}
public Rectangle(double _width, double _depth) {
this.Width = _width;
this.Depth = _depth;
}
public double Area
{ get
{ //return calculation result for area; }
}
public double Perimeter
{ get
{ //return calculation result for perimeter; }
}
public ValueTuple<double, double> getDimensions()
{
return //tuple containing both width and depth
}
}
//Start of circle class.
public class Circle : IShape2D
{
public double Diameter {get; set;}
public Circle(double _diameter) {
this.Diameter = _diameter;
}
public double Area
{ get
{ //return calculation result for area; }
}
public double Perimeter
{ get
{ //return calculation result for perimeter; }
}
public ValueTuple<double> getDimensions()
{
return //tuple containing diameter
}
}
public class NewClass(IShape2D _2dObject)
{
//this class receives either rectangle or circle object, with access to local properties and methods.
}