inheritance和多态之间有什么区别?

你能给我一个简单的inheritance和多态的例子,那么它可以完全清楚和易懂吗?

使用C#会让它更清晰,因为我已经学会了它。

PS:导师,我们用的书是用母语,(阿拉伯语)

抱歉,如果这个问题看起来如此简单,对你们来说甚至是愚蠢的,但这些概念被认为很难; 如果你不完全理解它们,那么你就失败了。

让我用我最喜欢的动词,我们发现:

http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29

http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

多态性和inheritance是C#和面向对象编程的关键,需要根深蒂固的基本概念。 说你知道C#而不是这就像知道如何说英语,并且不知道字母是什么。 对不起,直言不讳,但确实如此。

从上面的Wiki链接(这不是我的),这里是多态性的一个例子(转换为C#…)

public class Animal { public virtual String talk() { return "Hi"; } public string sing() { return "lalala"; } } public class Cat : Animal { public override String talk() { return "Meow!"; } } public class Dog : Animal { public override String talk() { return "Woof!"; } public new string sing() { return "woofa woofa woooof"; } } public class CSharpExampleTestBecauseYouAskedForIt { public CSharpExampleTestBecauseYouAskedForIt() { write(new Cat()); write(new Dog()); } public void write(Animal a) { System.Diagnostics.Debug.WriteLine(a.talk()); } } 

这是多态性:

 public interface Animal { string Name { get; } } public class Dog : Animal { public string Name { get { return "Dog"; } } } public class Cat : Animal { public string Name { get { return "Cat"; } } } public class Test { static void Main() { // Polymorphism Animal animal = new Dog(); Animal animalTwo = new Cat(); Console.WriteLine(animal.Name); Console.WriteLine(animalTwo.Name); } } 

这是inheritance:

 public class BaseClass { public string HelloMessage = "Hello, World!"; } public class SubClass : BaseClass { public string ArbitraryMessage = "Uh, Hi!"; } public class Test { static void Main() { SubClass subClass = new SubClass(); // Inheritence Console.WriteLine(subClass.HelloMessage); } } 

inheritance意味着如果你创建一个带有公共字段TankSize的类Car,那么你从它派生一个类SuperCar,最后一个类inheritance了Car的字段TankSize。

多态性是这样一个事实,即每次在代码中你都有一个方法,其中一个Car可以通过SuperCar并且它的行为就像一辆Car。

根据需要定义虚方法,您将在基类上调用方法,但您正在处理的实际对象将执行其虚拟方法的版本,因此您实际上将调用SuperCar.GetPrice而不是Car.GetPrice。

用几句话来说,我看到其他人在我写作时已经回答了。

让我们以一种更有趣的方式解释这一点。 inheritance是派生类利用基类function的方式。 多态性是基类利用派生类的实现的方式。

 public class Triangle :Shape { public int getSides() { return 3; } } } public class Shape { public boolean isSharp(){ return true; } public virtual int getSides(){ return 0 ; } public static void main() { Triangle tri = new Triangle(); System.Console.WriteLine("Triangle is a type of sharp? " + tri.isSharp()); //Inheritance Shape shape = new Triangle(); System.Console.WriteLine("My shape has " + shape.getSides() + " sides."); //Polymorphism } } 

多态性是覆盖您inheritance的行为。

如果你不覆盖它,它不是多态,它只是inheritance。

inheritance和多态之间没有区别。 多态性是inheritance的一部分,没有它就不可能存在。 简而言之,多态性是将对象视为基类对象的能力,但在基类上调用VIRTUAL方法将从子类调用适当的方法。 很好的例子在这里: http : //www.psworld.pl/Programming/Inheritance

从基类派生类时,派生类将inheritance除构造函数之外的基类的所有成员,但派生类是否能够访问这些成员将取决于基类中这些成员的可访问性。 C#通过inheritance为我们提供了多态性。 基于inheritance的多态允许我们在基类中定义方法,并使用派生类实现覆盖它们。 因此,如果您有一个可能持有多个派生类对象之一的基类对象,则在正确使用时,多态性允许您根据对象所属的派生类的类型调用将以不同方式工作的方法。

参考文献: http : //www.codeproject.com/Articles/1445/Introduction-to-inheritance-polymorphism-in-C

一切都与行为有关。

类声明某种行为(接口或契约):

该类还可以定义该行为(实现)或将其全部或部分委托给其任何子类:

在伪代码中:

 class Animal { method walk() method speak() method jump() // ... here goes the implementation of the methods } 

通过子类化,您可以使类inheritance另一个类的行为。

当方法的实现被委托给子类时,该方法在基类中称为抽象 ,并且在Java等语言中,整个基类也变为抽象:

 abstract class Animal { method walk() { doWalk() } method speak() { print "hi, I am an animal!" } abstract method jump() // delegated to specific animals } class Horse inherits from Animal { override method walk() { doWalkLikeAHorse() } override method speak() { print "hi, I am a horse!" } override method jump() { doJumpLikeAHorse() } } class Elephant inherits from Animal { override method walk() { doWalkLikeAnElephant() } override method speak() { print "hi, I am an elephant!" } override method jump() { throw error "Sorry, I can't jump!!" } } 

默认情况下,类的行为是虚拟的 ,这意味着任何子类都可以覆盖任何类方法。 这就是它在C#和Java等语言中的工作方式,但不一定在C ++中。

实质上,基类的行为只是虚拟的,当子类覆盖该虚拟行为时,可以假设“多个”( 多边形 )“不同forms”( 变形 )。 这就是为什么它被称为多态性 。 在伪代码中:

 function makeAnimalSpeak(Animal animal) { animal.speak(); } makeAnimalSpeak(new Elephant()) // output: "hi, I am an elephant" makeAnimalSpeak(new Horse()) // output: "hi, I am a horse" 

其他人在这里为您提供了更好的例子。

在像C#和Java这样的语言中,你有接口的想法(在C ++中不存在),这只是行为的声明。 与类不同,接口没有义务实现行为。 这只是一个宣言。 任何类都可以实现该行为,无论它们从哪个基类inheritance。 在伪代码中:

 interface FlyingBeing { method fly() } class FlyingPig inherits from Animal implements FlyingBeing { method fly() { print "hey, look at me, I am a flying pig!!" } }