类属性的接口方法返回不同数量的参数?

时间:2019-10-13 17:49:03

标签: c# interface polymorphism

我有一个接口:IShape2D,具有Area(),Perimeter()等方法。

我也有两个类:矩形和圆形。

这两个类均实现IShape2D。但它们也具有局部属性,具体取决于其形状。例如,矩形具有宽度和深度,而圆形仅具有直径。

我试图将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 个答案:

答案 0 :(得分:1)

我可能不会这样做。如果您试图在期望基本类型的区域中获取它们的私有部分,则似乎形状类型将不可避免地会在代码中收敛。但是,如果您坚持要这样做,则可能要创建一个灵活的单一返回类型。也许是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 }
       };
   }
}

这样,您可以获得键及其数量以及值。

答案 1 :(得分:0)

接口的重点是使您从每种形状的特定实现中抽象出来。如果您仍然需要一种适用于所有形状的方法GetDimensions(),那么即使我怀疑对此有任何几何应用,也可以返回一个List<double>的尺寸。

每个形状都可以返回带有不同数量项的List