这个问题类似于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");


如果是这样,它将是超级:

当我向CircleBox类添加方法时,请勿触摸CircleAndBox类。就像从单个类进行常规继承一样,CircleAndBox应该自动从CircleBox继承所有公共方法。

最佳答案

CircleAndBox从这两个类都继承,而要引用那些类的对象。它将必须重新定义每个类的方法。您可以向CircleBox添加隐式转换,以允许在期望引用这些对象的上下文中使用它。

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;

10-06 02:45