C# 设置多个基类

C# 设置多个基类,c#,xamarin.android,C#,Xamarin.android,我有个问题。我现在使用MainActivity.cs作为一个片段活动,但我也需要它作为一个应用程序活动。现在,当我尝试这个: public class MainActivity : FragmentActivity, AppCompatActivity 它给出了错误: 类“MainActivity”不能有多个基类: “FragmentActivity”和“AppCompatActivity” 但是我两者都需要,那么如何解决这个问题呢?C#不支持多个基类,但允许实现多个接口。作文也是合法的 这样

我有个问题。我现在使用MainActivity.cs作为一个片段活动,但我也需要它作为一个应用程序活动。现在,当我尝试这个:

public class MainActivity : FragmentActivity, AppCompatActivity
它给出了错误:

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

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

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;
}
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();
}
注意,您将能够隐式地将
C
转换为
A
B

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

如果
FragmentActivity
AppCompatActivity
实现接口,则执行以下操作:

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

在这种情况下,任何类型转换都可以正常工作。

C#不支持多重继承。也许可以使用组合。组合很重要,因为继承不是向类添加功能的理想方式。如果一个类需要能够做一些不属于其自身目的的事情,那么它应该依赖另一个类来做,而不是继承。