Метод интерфейса для свойств класса, возвращающий различное количество аргументов? - PullRequest
0 голосов
/ 13 октября 2019

У меня один интерфейс: 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.  
}

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Я бы, наверное, этого не сделал. Кажется, что типы фигур неизбежно сойдутся в коде, если вы попытаетесь добраться до их частных частей в областях, где вы ожидаете базовый тип. Но если вы настаиваете, вы, вероятно, захотите сделать один тип возвращаемого значения гибким;может быть Dictionary<string, double>, вот так:

public class Rectangle : IShape2D
{

   public double Width {get; set;}
   public double Depth {get; set;}

   ...

   public Dictionary<string, double> getDimensions()
   {
       return new Dictionary<string, double>
       {
           { nameof(Width), Width },
           { nameof(Depth), Depth }
       };
   }
}

public class Circle : IShape2D
{

   public double Diameter {get; set;}

   ...

   public Dictionary<string, double> getDimensions()
   {
       return new Dictionary<string, double>
       {
           { nameof(Diameter), Diameter }
       };
   }
}

Таким образом, вы можете получить ключи и их количество, а также значения.

0 голосов
/ 13 октября 2019

Цель интерфейсов - абстрагироваться от конкретных реализаций каждой фигуры, которую вы имеете. Если вам все еще нужен метод GetDimensions() для всех фигур, возможно, вы могли бы вернуть List<double> размеров, хотя я сомневаюсь, что к нему есть какие-либо геометрические приложения.

Каждая фигура может вернуть Listс разным количеством предметов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...