C# 如何为多个平台指定视图?

C# 如何为多个平台指定视图?,c#,android,ios,inheritance,xamarin,C#,Android,Ios,Inheritance,Xamarin,这很难用语言表达 我有一个类LoginPage:Activity,它包含了Android常用的视图设置,比如OnCreate(Bundle)等 但由于这是一个跨平台的项目,我想概括每个平台(iOS、Windows)的视图结构,所以我编写了一个公共抽象类LoginPage,它只有抽象DoPageSetup()和抽象checkLogin()等方法 问题: 当我把抽象类LoginPage放到我的核心项目(PCL)中时,我可以从我的Android项目继承它,但由于C#中禁止多重继承,我也不能从我需要的活

这很难用语言表达

我有一个
类LoginPage:Activity
,它包含了Android常用的视图设置,比如
OnCreate(Bundle)

但由于这是一个跨平台的项目,我想概括每个平台(iOS、Windows)的视图结构,所以我编写了一个
公共抽象类LoginPage
,它只有
抽象DoPageSetup()
抽象checkLogin()
等方法

问题: 当我把
抽象类LoginPage
放到我的核心项目(PCL)中时,我可以从我的Android项目继承它,但由于C#中禁止多重继承,我也不能从我需要的活动继承

因为在一天结束时,我会从我的
main活动中这样调用
LoginPage
StartActivity(typeof(LoginPage))

但是实现的
LoginPage
需要遵循我的
抽象类的结构
,并从C#中的
活动
继承,您要查找的单词是
接口

您将无法在接口定义中实现任何方法,但可以在那里声明它们

public interface LoginPage {
  void doPageSetup();
  void checkLogin();
  //...
}
public class SpecificLoginPage : Activity, LoginPage {
  void doPageSetup() {
  }
  void checkLogin() {
  }
  //...
}

听起来你想使用两个选项

<> LI>如果您想共享UI代码,请考虑使用XAMARIN。窗体。Forms是一种跨平台的抽象,它允许您开发UI,并且最终将在每个平台上使用本机UI元素
  • 第二种选择是使用MVVM模式。MVVMCross框架非常流行,功能非常强大。如果您不熟悉MVVM,请查阅它,它是一种非常强大的模式,可以在跨平台应用程序中共享代码(使用MVVMCross)
    这两种选择都将取决于您的需求,实际上没有正确或错误的选择。这将取决于你的目标平台和你的应用目标。

    Saphire让我详细说明这一点:


    您可以考虑使用委托而不是继承。如果LoginPage类不知道实际UI的详细信息,那么它可能是MVC(或MPC)设计模式的模型部分,活动应该引用LoginPage,而不是“作为”LoginPage

    Model View Presenter(MVP)是一种设计模式,通常适用于具有用户界面的应用程序。其目的是将应用程序分为三个可以相对独立地实现的角色:]

    • 视图的作用是绘制屏幕并为用户提供单击或键入的位置

      • 示例:可以在其中键入登录Id的文本视图
      • 在Android术语中,视图是包含嵌套视图的布局/视图组
    • 模型的作用是保存域或业务数据:

      • 示例:登录凭据以及它们是否有效
      • 这不是特定于平台的。登录状态发生在您运行的任何平台上
    • 演示者的角色是充当视图和模型之间的粘合剂。
      • 当用户单击[登录]按钮时,活动(扮演演示者)从视图中获取文本(不必担心它是什么类型的视图),并向登录页面[模型]发送“用户希望使用这些凭据登录”请求
      • 当登录页面[Model]响应、确定或拒绝时,活动[Presenter]使用该信息更新视图中的相应元素,甚至可能启动新活动
    我想说的是,既然LoginPage对于plaform是不可知论的,那么它可能是在扮演模型的角色。我会让你来判断MVP模式是否适合你的设计


    提供模型视图演示者的更详细解释。

    您有一个更大的问题。你希望如何在Android上运行C#应用程序?Xamarin没有问题。哦,很好。请在你的问题中提及和/或适当地标记你的问题。你可以考虑使用委托而不是继承。如果LoginPage类不知道实际UI的详细信息,那么它可能是MVC(或MPC)设计模式的模型部分,活动应该引用LoginPage,而不是“成为”LoginPage。我不太理解,请您在回答中详细说明一下好吗?谢谢Ian,这确实有效。我找了一种方法,我可以部分地实现共享视图类,因此我选择了抽象。考虑创建一个<代码> Login PrimeEdgule</代码>,它为您处理平台无关代码。您必须在每个
    SpecificLoginPage
    类中创建一个实例,但是编写一行实例化要比复制代码便宜。