【问题标题】:Is using inheritance like this a bad idea像这样使用继承是个坏主意
【发布时间】:2013-12-08 11:47:06
【问题描述】:

你好,我编程经验不足,为android做项目慢慢学习。

问题是我在我的活动中使用了很多相同的代码。使用继承共享代码是不是一个坏主意。

示例:

Class Main extends Activity
       //shared code

           _
Class a     |
Class b     | - extends Main
Class c    _|

我的用法示例:

public class Global extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
}

public void toastMessage(String tMsg, int tLength) {
    Toast.makeText(getApplicationContext(), tMsg, tLength).show();
}

public void nextActivity(Class<?> classId, ImageButton btnId) {
    AlphaAnimation alpha;
    Vibrator shake = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    if (btnId!= null) {
        alpha = new AlphaAnimation(0.5F, 1.0F);
        alpha.setDuration(50);
        alpha.setFillAfter(false);
        btnId.startAnimation(alpha);
    }
    shake.vibrate(50);
    Intent goToNextActivity = new Intent(getApplicationContext(), classId);
    startActivity(goToNextActivity);
}

a、b、c 类可以扩展 Global 并使用:

  nextActivity(a.class, btnA);
  toastMessage("example", Toast.LENGTH_SHORT);

【问题讨论】:

  • 信息太少了。如果是为了学习,那就去试试吧。如果你遇到问题,你就会知道这是一个糟糕的选择。
  • 添加了我的使用示例。它只是想知道它是否对性能/可读性不利。
  • 如果您将Context 设为方法参数,您可以将其移动到某个实用程序类中。 (或者你可以从你的ImageButton得到它)

标签: java android performance inheritance


【解决方案1】:

一般来说,仅将继承用于代码重用并不是一个好主意。继承使用“is a”范式。看看是否更适合您使用组合。遵循 Matthijs 的建议,始终发布您的代码。

【讨论】:

  • 我同意 一般来说,仅将继承用于代码重用并不是一个好主意,我很惊讶官方文档声明 “继承的想法简单而强大:当你想创建一个新类并且已经有一个类包含你想要的一些代码时,你可以从现有类派生你的新类。这样做,你可以重用字段和现有类的方法,而不必自己编写(和调试!)它们。” (docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) 误导,我认为他们应该更好地用词。
  • 我同意,文档在描述继承的本质方面很薄弱:简而言之,使用 B 类的实例“而不是”(或者如果您愿意,可以使用“原样”) A类的一个实例。每当我们想从一个类继承时,很少有几个简单的问题会有所帮助: 1. 是否可以始终使用派生类而不是基类?如果不是,继承没有意义 2.派生类可以使用基类接口还是需要不同的接口?如果没有,组合更好 3.是否存在另一种最小化耦合的方法?如果是,则选择最弱的关系(组合)
【解决方案2】:

继承用于表示一个类属于某个“类别”,例如:

一个名为“地精”的类扩展了“敌人”类。在“敌人”内部有适用于所有敌人(行走、人工智能、攻击等)的简单代码,在“地精”类内部有图形之类的代码,可能是一些对话框、动画或不共享给所有敌人的东西。

在某些情况下,这非常有用,例如控制所有敌人,尽管其中一些实际上是地精或兽人或其他什么。关于代码重用,您可以使用方法来完成它,请记住,您的代码必须易于阅读(即使它只适合您)所以不要将所有步骤放在一个类中,例如(它将是又是一个视频游戏的例子:P)

while(game == true)
{
    getInput();

    moveHero();

    moveEnemies();

    applyGravity();

    drawFrame();
}

即使像“moveHero”和“moveEnemies”这样的情况几乎总是会一个接一个地应用,将它们组合在一起并不是一个好主意,这样您就可以轻松地了解程序中发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2011-10-21
    • 1970-01-01
    • 2012-06-18
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多