A. *_*ijk 2 c# xamarin.android
我有个问题。我现在使用我的 MainActivity.cs 作为 FragmentActivity,但我也需要它是 AppCompatActivity。现在当我尝试这个时:
public class MainActivity : FragmentActivity, AppCompatActivity
Run Code Online (Sandbox Code Playgroud)
它给出了错误:
类“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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您将能够转换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();
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)
如果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();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,任何铸造都可以正常工作。
| 归档时间: |
|
| 查看次数: |
1531 次 |
| 最近记录: |