设置多个基类

A. *_*ijk 2 c# xamarin.android

我有个问题。我现在使用我的 MainActivity.cs 作为 FragmentActivity,但我也需要它是 AppCompatActivity。现在当我尝试这个时:

public class MainActivity : FragmentActivity, AppCompatActivity
Run Code Online (Sandbox Code Playgroud)

它给出了错误:

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

但我需要两者,那么我该如何解决这个问题?

Ale*_*lex 7

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您将能够转换CAB隐式地喜欢

C c = new C(new A(), new B());
c.DoAStuff();
c.DoBStuff();
A a = c;
a.DoAStuff();
B b = c;
b.DoBStuff();
Run Code Online (Sandbox Code Playgroud)

new[] { new C(new A(), new B()) }.Cast<B>().ToArray()
Run Code Online (Sandbox Code Playgroud)

会扔System.InvalidCastException

new[] { new C(new A(), new B()) }.Select(i => (B)i).ToArray();
Run Code Online (Sandbox Code Playgroud)

如果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();
}
Run Code Online (Sandbox Code Playgroud)

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