设置多个基类

时间:2019-05-11 13:45:02

标签: c# xamarin.android

我有问题。我现在将MainActivity.cs用作FragmentActivity,但我也需要将其用作AppCompatActivity。现在,当我尝试这样做时:

public class MainActivity : FragmentActivity, AppCompatActivity

它给出了错误:

  

类'MainActivity'不能有多个基类:   “ FragmentActivity”和“ AppCompatActivity”

但是我两个都需要,那么如何解决呢?

1 个答案:

答案 0 :(得分:4)

C#不支持多个基类,但是允许实现多个接口。而且构图也是合法的。

这样做:

class A
{
    public void DoAStuff() { }
}

class B
{
    public void DoBStuff() { }
}

class C
{
    private readonly A a;
    private readonly B b;

    public C(A a, B b) => (this.a, this.b) = (a, b);

    public void DoAStuff() => a.DoAStuff();

    public void DoBStuff() => b.DoBStuff();

    public static implicit operator A(C c) => c.a;

    public static implicit operator B(C c) => c.b;
}

请注意,您将可以像{p>那样隐式将C投射到AB

C c = new C(new A(), new B());
c.DoAStuff();
c.DoBStuff();
A a = c;
a.DoAStuff();
B b = c;
b.DoBStuff();

但是

new[] { new C(new A(), new B()) }.Cast<B>().ToArray()

将抛出System.InvalidCastException

使用

new[] { new C(new A(), new B()) }.Select(i => (B)i).ToArray();

如果FragmentActivityAppCompatActivity实现接口是这样的:

interface IA
{
    void DoAStuff();
}

class A : IA
{
    public void DoAStuff() { }
}

interface IB
{
    void DoBStuff();
}

class B : IB
{
    public void DoBStuff() { }
}

class C : IA, IB
{
    private readonly IA a;
    private readonly IB b;

    public C(IA a, IB b) => (this.a, this.b) = (a, b);

    public void DoAStuff() => a.DoAStuff();

    public void DoBStuff() => b.DoBStuff();
}

在这种情况下,任何投射都可以正常工作。