我有一个接口: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.
}
答案 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
。