0

我对 java +/- android 编码(旧的 C++ 编码器)比较陌生。我正在构建一个应用程序,用户可以在其中使用类似的界面处理不同的案例。答案/功能/内部运作/数字将根据情况而有所不同。

示例:我有一个 VitalsDisplay 活动,它应该是通用的 Vitals 显示代码。它想使用一个函数 - SetVitals(Vitals) - 在显示生命体征之前修改字符串数组 Vitals。

SetVitals 必须是“智能的”——基于我正在处理的情况(int CaseNumber,在 MainActivity 中定义的公共 int),它将以不同的方式修改生命体征数组。现在,定义 SetVitals 的简单方法是:

public static string[] SetVitals(String[] givenVitals){

  switch (MainActivity.CaseNumber){
    case 1: 
      //Change vitals in one way
      break;
    case 2:
      //Change Vitals in another way
      break;

  }
}

我不想这样做,因为我担心将来会扩展 - 例如,如果我想添加额外的案例,我将不得不搜索并检查这段代码以进行更改。此外,每个案例需要做的不仅仅是设置生命体征(您将订购测试等,这将不得不根据案例返回不同的结果)。因此,在未来扩展它意味着我必须通过 Vitals、Results、Tests 函数等来寻找和啄食。

相反,我希望定义多个活动:

例如 ChestPain1、ChestPain2 和 ChestPain3。每个都有一个 SetVitals(字符串数组 Vitals)的实例。它们还将具有可由主活动调用的 OrderResults、CaseUpdates 等实例。

这种方法的问题有两个:

  1. 现在 switch 语句被移动到 VitalsDisplay 活动/函数。这本身还不错——在某些时候需要一个 switch 语句来根据用户正在执行的情况来决定需要调用哪个函数。

我想知道是否有一种方法不必每次我需要从唯一活动中的函数(基于 CaseNumber)中获取特定于案例的信息时都不必重新创建 switch 语句?我尝试基于 switch 语句创建意图,然后使用意图调用函数......但失败了(可能是我的错,因为我还不擅长使用意图)

  1. 我也尝试过这样做:

    public boolean VitalsDisplay(){ if (CaseNumber == 1){

      ChestPain1 CaseInfoToCall = new ChestPain1();
    
    }
    
    else if (CaseNumber ==2){
    
      ChestPain2 CaseInfoToCall = new ChestPain2();
    
    }
    
      ClassInfoToCall.SetVitals(array);
    

    //更新文本字段并显示生命体征 }

得到一个错误:“重复的局部变量 ClassInfoToCall”。

关于如何更好地实现这一点的任何想法?

摘要:如何从一个活动中调用多个类中名称相似的函数?从哪个类调用的决定将基于 MainActivity 中设置的 int 变量。

(除非有人有更清洁的方法来做到这一点——我也完全愿意这样做!)

4

2 回答 2

1

从不同的类调用具有相同名称的函数

您可以使这些类使用您要调用的方法实现接口。然后,当您拥有这些类之一的实例时,您可以调用它。

更新 1

interface YourInterface {
    void DoSomething();
}

class A implements YourInterface {
    @Override
    void DoSomething() {
        // ...
    }
}

class B implements YourInterface {
    @Override
    void DoSomething() {
        // ...
    }
}

// now, somewhere else...

    YourInterface foo =
        someBooleanVariable ?
            new A() :
            new B();
    // we don't know is it an instance of A or B, but corresponding method will be called:
    foo.DoSomething();

抱歉,如果有错误,我目前没有安装 Java...

于 2013-09-19T19:33:03.963 回答
0

这是我所做的,希望它符合您的需要,我只用了 2 个案例,但对于更多案例来说也是一样的:

public class MainActivity extends Activity {

    CaseWorker worker;


    Button button1;
    Button button2;


    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = (Button)findViewById(R.id.button1);
        button2 = (Button)findViewById(R.id.button2);

        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                worker = new CaseOne();

            }
        });


        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                worker = new CaseTwo();

            }
        });

    }

    public void anotherMethod(String[] givenVitals){
       worker.SetVitals(givenVitals);
   }
}

这是 CaseWorker 界面,您可以向其中添加其他与案例相关的行为:

public interface CaseWorker {
    public  String[] SetVitals(String[] givenVitals);
}

以下是与这两种情况相对应的两种实现:

public class CaseOne implements CaseWorker {

    @Override
    public String[] SetVitals(String[] givenVitals) {
        // do the work the first way
        return null;
    }

}


public class CaseTwo implements CaseWorker {

    @Override
    public String[] SetVitals(String[] givenVitals) {
        // do the work the second way
        return null;
    }

}

您可以添加其他按钮,并且对于您添加的每个按钮,您必须提供另一个 CaseWorker 实现:CaseThree、CaseFour、... 无需切换,因为您已经通过将侦听器设置为您拥有的不同按钮来进行切换(开关已经在 UI 中)。

于 2013-09-19T20:44:29.390 回答