这个问题类似于this one。区别在于我想拥有两个基类。
例:
public class Circle
{
private string _radius { get; set; }
public Circle Radius(string radius)
{
_radius = radius;
return this;
}
}
public class Box
{
private string _width { get; set; }
public Circle Width(string width)
{
_width = width;
return this;
}
}
public class CircleAndBox : Circle, Box // Can't do in c#
{
// should contain methods from both Circle and Box, but return CircleAndBox
}
也许Circle and Box不是最好的例子。基本上,它们表示具有不同属性和方法的类。 CircleAndBox类恰好具有与Circle和Box相同的属性和方法。 CircleAndBox可能具有Circle和Box中都不存在的其他属性和方法。
所需结果
我应该能够写:
var circle = new Circle().Radius("5");
var box = new Box().Width("6");
var circleAndBox = new CircleAndBox().Radius("5").Width("6");
如果是这样,它将是超级:
当我向
Circle
或Box
类添加方法时,请勿触摸CircleAndBox
类。就像从单个类进行常规继承一样,CircleAndBox
应该自动从Circle
和Box
继承所有公共方法。 最佳答案
让CircleAndBox
从这两个类都继承,而要引用那些类的对象。它将必须重新定义每个类的方法。您可以向Circle
和Box
添加隐式转换,以允许在期望引用这些对象的上下文中使用它。
public class CircleAndBox
{
public Circle Circle { get; private set; }
public Box Box { get; private set; }
public CircleAndBox()
{
Circle = new Circle();
Box = new Box();
}
public CircleAndBox Radius(string radius)
{
Circle.Radius(radius);
return this;
}
public CircleAndBox Width(string width)
{
Box.Width(width);
return this;
}
public static implicit operator Circle(CircleAndBox self)
{
return self == null ? null : self.Circle;
}
public static implicit operator Box(CircleAndBox self)
{
return self == null ? null : self.Box;
}
}
请注意,隐式转换不会保留对象的类型,因此不应使用此技术将
CircleAndBox
传递给采用Box
的方法,并期望另一端的结果为CircleAndBox
。CircleAndBox cb = new CircleAndBox();
// Implicit conversion, b contains a Box object.
Box b = cb;
// Compile-time error CS0030.
cb = (CircleAndBox)b;