2012-06-08 42 views
7

Tôi dường như không tìm được câu trả lời thỏa đáng cho câu hỏi thừa kế này. Tại sao bạn khai báo một loại phụ như thế này đôi khi:C# khai báo lớp con dưới dạng siêu lớp

Shape myCircle = new Circle(); 

và lần khác này?

Circle myShape = new Circle(); 

đâu Circle là một con/sub-class của Shape .....

Có dường như không có sự nhất quán trên những cuốn sách OO Tôi đã đọc và giải thích tôi có thể có được đầu của tôi xung quanh. Mọi người đã chỉ cho tôi ví dụ về một lớp Shapes được khởi tạo cho các vòng tròn, hình vuông, v.v ... Nhưng tôi không hiểu khi nào bạn sử dụng tờ khai thứ nhất và thứ hai.

Trả lời

3

Có lẽ bạn có một danh sách các hình dạng và bạn không quan tâm đến hình dạng của chúng là gì bởi vì những gì bạn cần làm với danh sách đó là chung cho tất cả các hình dạng (ví dụ vẽ), bạn sẽ muốn thêm chúng vào danh sách như thế này

List<Shape> shapeList = new List<Shape>(); 
shapeList.Add(new Circle()); 
shapeList.Add(new Rectangle()); 
foreach (Shape shape in shapeList) 
{ 
    shape.Draw(); 
} 

Bằng cách này, bạn có thể truy cập các phương pháp chung về hình dạng trên các đối tượng thực sự là cha mẹ. Sau đó, nếu bạn muốn làm điều gì đó cụ thể cho các vòng kết nối, bạn có thể sử dụng cùng một danh sách như thế này.

foreach (Shape shape in shapeList) 
{ 
    if (!(shape is Circle)) continue; 
    Circle circle = shape as Circle; 
    circle.Radius = 100; 
} 
7

Thường muốn xử lý các đối tượng của lớp bê tông polymorphically để tránh tạo phụ thuộc vào các loại cụ thể mà bạn có thể tránh chúng. Ví dụ: nếu bạn đang tạo một Circle với ý định vẽ nó và Draw() là phương thức của Shape, thì tốt hơn là khai báo myCircle làm hình dạng, trong trường hợp bạn quyết định thay thế nó bằng hình vuông sau này.

Mặt khác, nếu mục đích của bạn là để làm một cái gì đó cụ thể để Circle, chẳng hạn, để đặt bán kính của nó, sau đó bạn cần phải khai báo myCircle như Circle, vì SetRadius() thể không có sẵn trên Shape.

1

Ngoài câu trả lời của @dasblinkenlight, bạn sẽ sử dụng khai báo đầu tiên, thay vì khai báo thứ hai, vì bạn muốn hạn chế hành vi của đối tượng myCircle đối với các thành viên của Circle.

Đó là bởi vì Circle là một lớp con của Shape, và nó sẽ có nghĩa rằng tất cả các thành viên của Shape sẽ được thừa hưởng bởi Circle, và trong một số trường hợp, bởi vì bạn đang sử dụng C# (và trọng các thành viên không phải lúc nào quy tắc, như trong Java), bị ghi đè.

Bạn không thể làm điều ngược lại:

Circle myCircle = new Shape(); 

Lý do được mô tả here.

Nếu không, nếu bạn đang sử dụng tuyên bố thứ hai, myCircle sẽ là đối tượng Circle, sử dụng các thành viên và các phương pháp sẵn có của Circle.

Các vấn đề liên quan