2014-06-16 62 views
3

最近有人问我这个问题:“为什么要一个重载的方法?”为什么我们应该重写一个方法?

我说,如果我有10种方法的一类,我想使用它的全部功能,除了一个方法,那么我将覆盖方法有我自己的功能。

然后面试官在那种情况下回答说,为什么我们不能写一个不同名称的新方法,而是使用该方法。

是的,这也是对的。现在我很困惑。重写一种方法的真正目的是什么?

任何人都可以告诉我吗?谢谢大家。

+0

继承想到.. – jahroy

+1

改变一个实现。使其更具体到儿童班。 – Stultuske

+0

重写一个已经实现的方法是OFTEN打破Liskov替换原则的根本原因(非常糟糕的设计)。一般来说,我们“覆盖”/(实现而不是更恰当的词)一种接口/抽象方法。 – Mik378

回答

3

代码如果您会给另一名在派生类中的方法,你不能使用相同的接口来调用它。您始终可以通过基类指针调用它。

Base p = new Derived(); 
p.overrideMethod(); 

如果派生类是从碱衍生那么它会自动调用基地的衍生版本,而不是。在名称不同的情况下,这是不可能的。它被称为接口的代码而不是实现。

4

好吧,告诉你的面试官,应始终对接口,无法实现:)

+2

我知道这很尴尬,但它根本没有解决这个问题。 –

+0

你是对的,它只是让我感到震惊,有人正在招聘不了解OOP的基础知识:) –

0

重写的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其要求实现父类方法。

1

我说,如果我有10种方法的类,我想用所有的 其功能除了一个方法,那么我将覆盖方法 有我自己的功能。

=>很多时候的方式打破Liskov Substitution principle ... =>极坏的面向对象的设计

你有这样的“破发”的网络上的例子很多,但一个你可以找到一个很好的解释here

0

一个使用接口允许多个实现,一个使用覆盖来简化接口的实现(例如,在实现WindowListener时,通常扩展并覆盖WindowAdapter的方法,以便不需要为默认行为足够的情况)。在这种情况下,添加新方法而不是重写将不起作用,因为调用方理解接口并调用其方法;这里覆盖的重点就是改变调用接口的行为。如果你只是简单地添加一个新的函数,那么调用者就必须知道这个函数,这会破坏一个功能的消费者与该功能的提供者之间的完全隔离,这是接口所提供的。

0

覆盖是使用继承时可用的功能。

当从另一个类扩展的类想要使用父类的大部分功能并希望在某些情况下实现特定功能时使用它。

在这种情况下,我们可以创建具有与父类相同的名称和签名的方法。这种方法掩盖了父方法的新方法,并且默认情况下会被调用。

1

为什么不能我们写一个不同名称的新方法和使用该方法

这是因为我们想用多态性。你可以告诉面试官这个例子:有一个模块调用特定的方法对你给它的对象;现在想象你不能改变那个模块(例如没有源代码)。你不能告诉它使用不同的方法,但你可以给它一个覆盖该方法的子类的对象。对模块来说,它看起来没有任何改变。

在实践中,往往也是你可以改变模块,但不希望的情况。

0

压倒一切的主要目的是代码reuseablity这在大项目advatageous,它也提供了flexiblity意味着你可以从任何一类通过不同组输入和获得输出

相关问题