Какая разница между наследованием и полиморфизмом?
Можете ли вы дать мне простой пример наследования и полиморфизма, чтобы он мог быть полностью ясным и понятным?
используя С#, станет более понятным, поскольку я уже узнал об этом.
P.S: репетиторы, книги у нас есть на родном языке (арабский)
Извините, если этот вопрос казался таким легким, даже глупым для вас, ребята, но эти понятия считаются сложными; если вы не полностью их понимаете, значит, вы терпите неудачу.
Ответы
Ответ 1
Позвольте использовать мой любимый глагол, и мы находим:
http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29
http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx
Полиморфизм и наследование являются ключевыми, необходимыми для понимания и фундаментальными концепциями для С# и объектно-ориентированного программирования. говоря, что вы знаете С#, а не это как знать, как говорить по-английски, и не имеют понятия о том, что такое алфавит. Извините за тупое, но это правда.
Из ссылки Wiki выше (это не мое), вот пример Полиморфизма (преобразованный в С#...)
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());
}
}
Ответ 2
Это полиморфизм:
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);
}
}
это Наследование:
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);
}
}
Ответ 3
Наследование означает, что если вы создадите класс Car с открытым полем TankSize, то вы получите из него класс SuperCar, последний унаследовал поле TankSize от Car.
Полиморфизм - это тот факт, что каждый раз в коде у вас есть метод, где ожидается автомобиль, вы можете передать SuperCar и он будет вести себя как автомобиль.
С помощью виртуальных методов, определенных по мере необходимости, вы будете вызывать метод в базовом классе, но фактический объект, над которым вы работаете, выполнит свою версию виртуального метода, чтобы вы вызывали SuperCar.GetPrice, а не Car.GetPrice на самом деле.
Это в нескольких словах, для большего, я вижу, что другие уже отвечают, когда я пишу.
Ответ 4
Объясним это более интересным образом.
Наследование - это способ, которым производный класс использует функциональность базового класса.
Полиморфизм - это способ использования базового класса для реализации производного класса.
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
}
}
Ответ 5
Нет никакой разницы между наследованием и полиморфизмом. Полиморфизм - ЧАСТЬ НАНА, и он не может существовать без него. В коротких словах полиморфизм - это способность рассматривать объект как объект базового класса, но вызов метода VIRTUAL в базовом классе вызовет подходящий метод из дочернего класса. Хороший пример: http://www.psworld.pl/Programming/Inheritance
Ответ 6
Когда вы получаете класс из базового класса, производный класс наследует всех членов базового класса, кроме конструкторов, хотя может ли производный класс иметь доступ к этим членам, будет зависеть от доступности этих членов в базе класс. С# дает нам полиморфизм через наследование. Полиморфизм на основе наследования позволяет нам определять методы в базовом классе и переопределять их с помощью реализации производных классов. Таким образом, если у вас есть объект базового класса, который может содержать один из нескольких объектов производного класса, полиморфизм при правильном использовании позволяет вам вызвать метод, который будет работать по-разному в зависимости от типа производного класса, к которому принадлежит объект.
Ссылка: http://www.codeproject.com/Articles/1445/Introduction-to-inheritance-polymorphism-in-C
Ответ 7
Полиморфизм - это акт переопределения того, что вы наследуете.
Если вы не переопределяете его, это не полиморфизм, это просто наследование.
Ответ 8
Все о поведении.
Класс объявляет определенное поведение (интерфейс или контракт):
Этот класс может также определять это поведение (реализацию) или делегировать либо его целое, либо часть его любому из своих подклассов:
В псевдокоде:
class Animal {
method walk()
method speak()
method jump()
// ... here goes the implementation of the methods
}
С помощью подкласса вы создаете класс наследовать поведение другого класса.
Когда реализация метода делегируется подклассам, метод называется abstract в базовом классе, а в таких языках, как 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!!"
}
}
Поведение класса по умолчанию virtual, что означает, что любые классы могут быть переопределены любыми подклассами. Так оно работает в таких языках, как С# и Java, но не обязательно в С++, например.
По сути, поведение базового класса является только виртуальным и может принимать "несколько" (poly) "разных форм" ( морфы), когда подклассы переопределяют этот виртуальный поведение. Вот почему он назвал полиморфизм. В псевдокоде:
function makeAnimalSpeak(Animal animal) {
animal.speak();
}
makeAnimalSpeak(new Elephant()) // output: "hi, I am an elephant"
makeAnimalSpeak(new Horse()) // output: "hi, I am a horse"
Другие люди предложили вам лучшие примеры здесь.
В таких языках, как С# и Java, у вас есть идея интерфейса (чего не существует в С++), что является просто объявлением поведения. Интерфейс, в отличие от класса, не обязан выполнять поведение. Это просто декларация. Любой класс может реализовать это поведение, независимо от того, какой базовый класс они наследуют. В псевдокоде:
interface FlyingBeing {
method fly()
}
class FlyingPig inherits from Animal implements FlyingBeing {
method fly() {
print "hey, look at me, I am a flying pig!!"
}
}