2010-01-15 39 views
5

Điều này có vẻ là "bài tập về nhà-ish" và/hoặc tầm thường, nhưng nó là dành cho mục đích kinh doanh thực sự; đó là cách dễ nhất tôi có thể nghĩ đến để giải thích những gì tôi đang cố gắng làm.Xác định các loại có nguồn gốc từ một danh sách các đối tượng lớp cơ sở

Giả sử tôi có lớp học Động vật và một số lớp khác (Chim, Mèo, Kangaroo). Mỗi người trong số này được thừa hưởng từ Động vật.

Animal có thể trông như thế này:

public class Animal 
{ 
    public Animal() 
    { 

    } 

    public string Name { get; set; } 
    public string AnimalType { get; set; } 
    public List<Animal> Friends { get; set; } 
} 

Kangaroo có thể trông như thế này:

public class Kangaroo : Animal 
{ 
    public Kangaroo() 
    { 

    } 

    public int TailLengthInches { get; set; } 
} 

Giả sử con kangaroo có hai người bạn, một con chim và một con mèo. Làm thế nào tôi có thể thêm những người vào danh sách của "Động vật" bạn bè (như loại động vật), nhưng bảo tồn khả năng truy cập các thuộc tính của các lớp học có nguồn gốc? (như trong, tôi vẫn cần phải có khả năng làm việc với các đặc tính cụ thể cho loại động vật, ví dụ như FeatherColor cho chim, mặc dù chúng sẽ được coi là "động vật".

Lý do tôi Tôi đang cố gắng làm điều này là khi sau này tôi nhận được danh sách "bạn bè" của động vật, điều quan trọng là tôi biết loại động vật mà bạn bè là gì. Tùy thuộc vào loại động vật (cho dù đó là chim, mèo, v.v ...) Tôi muốn làm một cái gì đó khác nhau (hiển thị một mẫu khác nhau trên một trang ASP.NET, trên thực tế, nhưng tôi không cần trợ giúp với điều đó cụ thể)

Tôi đoán nó sẽ giảm xuống ... nếu tôi có một danh sách các động vật, làm thế nào để tôi biết những gì các loại có nguồn gốc đã được cho mỗi đối tượng trong danh sách, vì vậy tôi có thể bỏ chúng trở lại loại có nguồn gốc của họ hoặc làm điều gì khác th tại cho phép tôi để có được các thuộc tính cụ thể, khác nhau trên mỗi loại có nguồn gốc?

Cảm ơn!

+1

Mẹo: để lấy mã để hiển thị một cách chính xác, sử dụng nút 101.010 trong trình soạn thảo (hoặc thụt bởi bốn không gian) . – itowlson

Trả lời

7

Bạn có thể sử dụng LINQ để lọc vào loại bạn đang tìm kiếm

animals.Friends = new List<Animal> { new Kangaroo(), new Bird() }; 
foreach (var kangaroo in animals.Friends.OfType<Kangaroo>()) { 
    kangaroo.Hop(); 
} 
+0

Đây là một cách thực sự thanh lịch để xử lý nó. Cảm ơn! –

1

Hãy thử đúc nó:

var friendBird = friend as Bird; 
if (friendBird != null) 
{ 
    // It's a bird, so do something with it 
) 
+0

+1 để sử dụng từ khóa 'as' để tránh việc ghép đôi liên quan đến từ khoá' is' và sau đó truyền đối tượng. –

1

Bạn có thể sử dụng typeof để có được những loại thực tế, hoặc sử dụng các is hoặc as nhà khai thác để kiểm tra, và tùy chọn diễn viên:

foreach (Animal a in Friends) 
{ 
    Kangaroo k = a as Kangaroo; 
    if (a != null) 
    { 
    // it's a kangaroo 
    k.JumpAround(); 
    } 
    Ostrich o = a as Ostrich; 
    if (o != null) 
    { 
    o.StickHeadInSand(); 
    } 
} 

(Tôi có không đã sử dụng các mệnh đề else ở đây, điều này có thể gây ra lỗi nếu bạn đang thử nghiệm các loại có thể thuộc hệ thống phân cấp, ví dụ: nếu bạn có cả hai điều khoản Kangaroo và Marsupial, bạn có thể KHÔNG muốn cả hai được thực hiện!)

Bạn cũng có thể làm điều này với is điều hành, trông đẹp hơn, nhưng sẽ làm cho FxCop khóc:

foreach (Animal a in Friends) 
{ 
    if (a is Kangaroo) 
    { 
    ((Kangaroo)a).JumpAround(); 
    } 
} 

Nói chung, bằng cách này, có thể bạn muốn tìm kiếm một cơ hội để đặt một phương pháp ảo trên Animal và thực hiện phương pháp đó đa hình, thay vì có các câu lệnh if quái vật dẫn đến ghép nối giòn với một tập hợp các lớp dẫn xuất cụ thể.

0

Sử dụng từ khóa 'is'.

nếu (động vật là Chim) ...

0
animals.Friends = new List<Animal> { new Kangaroo(), new Bird() }; 
foreach (Animal animal in animals.Friends) 
{ 
if (animal is Kangaroo) 
Console.WriteLine("Kangaroo"); 
else if (animal is Bird) 
Console.WriteLine("Bird"); 
} 
Các vấn đề liên quan