0

我有以下具有以下字段的对象:

class ObjectA
{
    float progress;
    bool isDone;
}

class ObjectB
{
    bool canceled;
}

我想创建ObjectC将绑定到,并拥有ObjectAObjectB字段progressisDonecanceled

我怎么能做这样的事情?

这是否可以通过dynamic类型或某些 Interface + ClassWrapper 组合实现?

ObjectA并且ObjectB类型、类、签名等不能更改。它们是按原样给出的。

4

4 回答 4

2

c# 中没有类的多基继承。做这种事情的最好方法是为每个行为声明接口:

interface IA
{
    float Progress {get;}
    bool IsDone {get;}
}

interface IB
{
    bool IsCanceled{get;}
}

并且可能是前两者的第三个:

interface IC : IA , IB
{
}

并在一个类中实现两者。

class C : IC
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
    public bool IsCanceled { get; set; }
}

然后你必须记住针对接口而不是类进行编程:

class SomeClass
{
  //If only IA features are required
  void DoSTH(IA c){}
}
于 2012-08-13T11:45:10.200 回答
0

你可以通过组合来做到这一点:

public class ObjectC
{
    public ObjectA ProgressInfo { get; set; }

    public ObjectB CanceledInfo { get; set; }
}

或通过接口:

public interface IProgressable
{
    float Progress { get; }

    bool IsDone { get; }
}

public interface ICancelable
{
    bool Canceled { get; }
}

那么你可以让你的新类实现这两个接口:

public class ObjectC : IProgressable, ICancelable
{
    ...
}
于 2012-08-13T11:45:14.087 回答
0

您正在寻找multiple inheritanceC# 不支持的 .

一种解决方案是使用接口,但它需要您多次实现代码:

public interface IFoo1
{
    float Progress { get; set; }
    bool IsDone { get; set; }
}

public interface IFoo2
{
    bool Canceled { get; set; }
}

public abstract class ObjectA : IFoo1
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
}

public abstract class ObjectB : IFoo2
{
    public bool Canceled { get; set; }
}

public class ObjectC : IFoo1, IFoo2
{
    public float Progress { get; set; }
    public bool IsDone { get; set; }
    public bool Canceled { get; set; }
}
于 2012-08-13T11:47:38.223 回答
0

您想要的内容无法通过正常方式实现,因为您的字段是私有的,因此无法访问ObjectAand之外的任何代码ObjectB

唯一的方法——我根本不推荐,因为它破坏了封装——是使用反射来访问这些成员。

于 2012-08-13T12:40:47.383 回答