我有问题。我现在将MainActivity.cs用作FragmentActivity,但我也需要将其用作AppCompatActivity。现在,当我尝试这样做时:
public class MainActivity : FragmentActivity, AppCompatActivity
它给出了错误:
类'MainActivity'不能有多个基类: “ FragmentActivity”和“ AppCompatActivity”
但是我两个都需要,那么如何解决呢?
答案 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
投射到A
和B
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();
如果FragmentActivity
和AppCompatActivity
实现接口是这样的:
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();
}
在这种情况下,任何投射都可以正常工作。