2011-09-06 24 views
12

bạn có thể cho tôi một ví dụ đơn giản về sự thừa kế và đa hình, vì vậy nó có thể hoàn toàn rõ ràng và dễ hiểu không?sự khác biệt giữa thừa kế và đa hình là gì?

sử dụng C# sẽ làm rõ hơn, vì tôi đã học được điều đó.

Tái bút: người dạy kèm, sách chúng tôi đã có được bằng tiếng mẹ đẻ, (arabic)

xin lỗi nếu câu hỏi đó dường như dễ dàng như vậy, thậm chí ngớ ngẩn trên các cậu, nhưng những khái niệm này được coi là khó khăn; nếu bạn không hiểu hết, thì bạn thất bại.

+28

Guys, poster rõ ràng không phải là một người nói tiếng Anh bản xứ, và anh ấy yêu cầu chúng tôi giúp anh ta hiểu sự khác biệt giữa hai từ tiếng Anh được sử dụng chủ yếu trong chương trình từ sách giáo khoa của ông được viết bằng tiếng Ả Rập. Vì anh ấy không biết tiếng Anh tốt, anh ấy hy vọng rằng một đoạn mã trong một ngôn ngữ anh ta hiểu sẽ giúp anh ta có được ý chính mà không cần phải đọc một vài đoạn giải thích bằng tiếng Anh. Cho anh ta nghỉ ngơi. – StriplingWarrior

+0

@Strip Đẹp thoery, nhưng OP có một lệnh tốt của ngôn ngữ tiếng Anh: http://stackoverflow.com/questions/7325073/how-could-i-get-over-my-programming-problems. –

+1

@chibacity: Ah, tốt. Vì vậy, nhiều để cho mọi người lợi ích của sự nghi ngờ. – StriplingWarrior

Trả lời

21

Hãy sử dụng động từ yêu thích của tôi và chúng tôi tìm thấy:

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

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

Polymorphism và Thừa kế là quan trọng, cần-to-be-ăn sâu và cơ bản khái niệm C# và đối tượng lập trình hướng. nói rằng bạn biết C# và điều này không giống như biết cách nói tiếng Anh và không có khái niệm về bảng chữ cái. Xin lỗi để được cùn, nhưng nó là sự thật.

Từ liên kết Wiki trên (đây không phải là của tôi), đây là một ví dụ về Đa hình (chuyển đổi sang 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()); 
    } 

} 
21

thừa kế có nghĩa là nếu bạn tạo một xe đẳng cấp với một lĩnh vực công cộng TankSize sau đó bạn lấy được từ nó một lớp SuperCar người cuối cùng đã thừa hưởng trường TankSize từ ô tô.

Đa hình là thực tế mỗi lần trong mã bạn có phương thức mà Ô tô được mong đợi bạn có thể vượt qua Siêu xe và nó sẽ hoạt động giống như Ô tô. Với các phương thức ảo được định nghĩa khi cần, bạn sẽ gọi một phương thức trên một lớp cơ sở nhưng đối tượng thực tế mà bạn đang làm việc sẽ thực thi phiên bản của phương thức ảo để bạn sẽ gọi SuperCar.GetPrice chứ không phải Car. GetPrice trên thực tế.

Điều này trong vài từ, để biết thêm, tôi thấy những người khác đã trả lời khi tôi viết.

+4

Từ đơn giản đôi khi có nghĩa là nhiều hơn một bài giảng, cảm ơn vì đã chia sẻ sự rõ ràng của tâm trí bạn. – Obzajd

+0

đoạn thứ hai của bạn là không chính xác, tôi tin. Bạn cần phải chuyển đổi xe và SuperCar xung quanh - mỗi khi bạn cần cha mẹ (SuperCar) bạn có thể vượt qua trong một đứa trẻ (xe hơi) – Jonesopolis

+0

@ Jonesy Tôi khá chắc chắn rằng ông đang sử dụng ngữ nghĩa phổ biến trên thế giới ở đây, _SuperCar_ là một chiếc xe tốt hơn, tăng cường. Sau đó, đó sẽ là một _SubCar_ nếu sử dụng ngữ nghĩa của lập trình viên. – Alex

37

Đây là đa hình:

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); 
    } 
} 

này là thừa kế:

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); 
     } 
    } 
8

Hãy giải thích điều này một cách thú vị hơn. Thừa kế là cách dẫn xuất lớp làm cho việc sử dụng các chức năng của lớp cơ sở. Đa hình là cách lớp cơ sở sử dụng thực hiện lớp dẫn xuất.

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 
} 
} 
+0

Bây giờ bạn đã nói rằng, Bằng cách nào đó, nó có chủ đề thú vị để học và sử dụng trong chương trình hàng ngày của tôi, không phải để tránh - trước đây. – Obzajd

6

Không có sự khác biệt giữa thừa kế và đa hình. Polymorphism là một phần của thừa kế và nó không thể tồn tại mà không có nó. Nói một cách ngắn gọn, đa hình là khả năng coi đối tượng là đối tượng của lớp cơ sở, nhưng gọi phương thức VIRTUAL trên lớp cơ sở sẽ gọi phương thức thích hợp từ lớp con.Ví dụ tốt là ở đây: http://www.psworld.pl/Programming/Inheritance

6

Khi bạn lấy được một lớp từ lớp cơ sở, lớp dẫn xuất sẽ kế thừa tất cả các thành viên của lớp cơ sở ngoại trừ các nhà xây dựng, mặc dù lớp dẫn xuất có thể truy cập vào các thành viên đó khả năng truy cập của những thành viên đó trong lớp cơ sở. C# cho chúng ta đa hình thông qua kế thừa. Tính đa hình dựa trên thừa kế cho phép chúng ta định nghĩa các phương thức trong một lớp cơ sở và ghi đè lên chúng với các triển khai lớp dẫn xuất. Vì vậy, nếu bạn có một đối tượng lớp cơ sở có thể đang nắm giữ một trong một số đối tượng lớp dẫn xuất, tính đa hình khi được sử dụng đúng cách cho phép bạn gọi một phương thức sẽ hoạt động khác nhau theo loại của lớp dẫn xuất thuộc đối tượng.

Tham chiếu: http://www.codeproject.com/Articles/1445/Introduction-to-inheritance-polymorphism-in-C

+0

Câu cuối cùng là rất hữu ích –

3

Đa hình là hành động ghi đè những gì bạn đã kế thừa.

Nếu bạn không ghi đè nó, nó không phải là đa hình, nó chỉ là thừa kế.

+1

Trừ khi bạn đang sử dụng giao diện. Sau đó, bạn đang thực hiện hành vi đa hình thông qua một giao diện. –

1

Đó là tất cả về hành vi.

Một lớp khai báo một hành vi nhất định (giao diện hoặc hợp đồng):

Đó lớp cũng có thể xác định rằng hành vi (thực hiện) hoặc đại biểu hoặc toàn bộ hoặc một phần của nó với bất kỳ lớp con của nó:

Trong giả:

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

Qua subclassing bạn thực hiện một kế thừa lớp khác lớp hành vi.

Khi thi hành một phương pháp được giao cho các lớp con, phương pháp này được gọi là trừu tượng trong lớp cơ sở và các ngôn ngữ như Java, lớp toàn bộ cơ sở trở nên trừu tượng cũng như:

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!!" 
    } 
} 

Một hành vi của lớp là theo mặc định virtual, có nghĩa là mọi phương thức lớp có thể bị ghi đè bởi bất kỳ lớp con nào. Đây là cách nó hoạt động trong các ngôn ngữ như C# và Java, nhưng không nhất thiết phải trong C++, ví dụ.

Trong chất, hành vi của một lớp cơ sở chỉ là ảo và có thể giả định "nhiều" (nhiều) "hình thức khác nhau" (morphs) khi lớp con ghi đè lên rằng hành vi ảo. Đó là lý do tại sao nó được gọi là đa hình. Trong mã giả:

function makeAnimalSpeak(Animal animal) { 
    animal.speak(); 
} 

makeAnimalSpeak(new Elephant()) // output: "hi, I am an elephant" 
makeAnimalSpeak(new Horse()) // output: "hi, I am a horse" 

Những người khác đã cung cấp cho bạn ví dụ tốt hơn tại đây.

Trong các ngôn ngữ như C# và Java, bạn có ý tưởng về giao diện (không tồn tại trong C++), đây chỉ là tuyên bố về hành vi. Một giao diện, không giống như một lớp, không có nghĩa vụ thực hiện một hành vi. Nó chỉ là một tuyên bố. Bất kỳ lớp nào cũng có thể thực hiện hành vi đó, bất kể lớp cơ sở mà chúng kế thừa từ đó là gì.Trong giả:

interface FlyingBeing { 
    method fly() 
} 

class FlyingPig inherits from Animal implements FlyingBeing { 
    method fly() { 
     print "hey, look at me, I am a flying pig!!" 
    } 
} 
Các vấn đề liên quan