从抽象引用创建接口+类包装器

时间:2012-08-13 11:35:45

标签: c# .net

我有以下对象,包含以下字段:

class ObjectA
{
    float progress;
    bool isDone;
}

class ObjectB
{
    bool canceled;
}

我想创建一个绑定的ObjectC,并拥有ObjectAObjectB个字段progressisDonecanceled

我怎么能这样做?

这是通过dynamic类型还是某些Interface + ClassWrapper组合实现的?

ObjectAObjectB类型,类,签名等无法更改。它们是按原样给出的。

4 个答案:

答案 0 :(得分: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){}
}

答案 1 :(得分: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
{
    ...
}

答案 2 :(得分:0)

您正在寻找C#不支持的multiple inheritance

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

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; }
}

答案 3 :(得分:0)

您无法通过常规方式获得所需内容,因为您的字段属于私有字段,因此ObjectAObjectB之外的任何代码均无法访问。

这样做的唯一方法 - 我根本不推荐,因为它打破了封装 - 将使用反射来访问这些成员。