C# 设置多个基类
我有个问题。我现在使用MainActivity.cs作为一个片段活动,但我也需要它作为一个应用程序活动。现在,当我尝试这个:C# 设置多个基类,c#,xamarin.android,C#,Xamarin.android,我有个问题。我现在使用MainActivity.cs作为一个片段活动,但我也需要它作为一个应用程序活动。现在,当我尝试这个: public class MainActivity : FragmentActivity, AppCompatActivity 它给出了错误: 类“MainActivity”不能有多个基类: “FragmentActivity”和“AppCompatActivity” 但是我两者都需要,那么如何解决这个问题呢?C#不支持多个基类,但允许实现多个接口。作文也是合法的 这样
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#不支持多重继承。也许可以使用组合。组合很重要,因为继承不是向类添加功能的理想方式。如果一个类需要能够做一些不属于其自身目的的事情,那么它应该依赖另一个类来做,而不是继承。