2013-05-26 24 views
7

Tôi hơi bối rối vì sao tôi có thể sử dụng 'điều này' trong các lớp trừu tượng.Từ khóa 'này' trong các lớp trừu tượng

Tôi đang tạo một trò chơi nhập vai hướng đối tượng rất đơn giản. Tôi có một cơ sở/siêu lớp được gọi là Items. Sau đó tôi có hai loại mặt hàng, equiptable và không equiptable.

interface IEquiptable 
{ 
    void equiptItem(Player p); 
    void unequiptItem(Player p); 
} 

Có giao diện cho các mục có thể equiptable.

Tiếp theo, tôi có một lớp trừu tượng gọi là Weapons:

abstract class Weapons : Items, IEquiptable 
{ 
    public double powerOfWeapon { get; set; } 
    public double powerNeededToUse { get; set; } 


    public void equiptItem(Player p) 
    { 
     Console.WriteLine(this); 
     p.weapon = this; 
    } 

    public void unequiptItem(Player p) 
    { 
     //UNTESTED METHOD 
     p.weapon = new Swords("Fists", 1, 1); 
    } 

} 

này mở rộng các lớp cơ sở của Items (lớp này chỉ chứa một tên cho mục vào lúc này, vì vậy không đáng để chương trình) và thực hiện các giao diện 'IEquiptable'.

Cuối cùng tôi có một lớp gọi là Swords

class Swords : Weapons 
{ 

    public Swords(string name, double powerOfS, double powerToU) 
    { 
     base.name = name; 
     powerOfWeapon = powerOfS; 
     powerNeededToUse = powerToU; 
    } 

} 

này mở rộng vũ khí và cung cấp một constructor vì gươm.

Dưới đây là một số Player lớp học của tôi

class Player 
{ 
    public string Name { get; set; } 
    public double life { get; set; } 
    public double power { get; set; } 
    public Weapons weapon { get; set; } // Currently held weapon 

    private List<Items> items; //This is being used to represent a 'backpack' any item obtained will be added here. 

Để eqipt một vũ khí Tôi đang sử dụng phương pháp này: (trong lớp cầu thủ của tôi)

public void equiptWeapon() 
    { 
     Weapons tempWep = items.OfType<Weapons>().FirstOrDefault(); 
     if (tempWep != null) 
     { 
      tempWep.equiptItem(this);   
     } 
    } 

Tôi không hiểu tại sao các công trình này. tempWep đang được đưa ra giá trị của Weapon đầu tiên trong danh sách. Nhưng sau đó nó được gọi phương thức equiptItem() đang được triển khai bởi lớp trừu tượng và sau đó 'this' đang được gán, mà tôi không thể làm theo cách nó không ném lỗi vì không khởi tạo Weapons

Hy vọng bạn có thể hiểu những gì tôi nói không.

Cảm ơn.

+1

Vũ khí không trang bị cho mình. 'Person' sẽ có phương thức' Equip'. Bất kể điều đó, một lớp trừu tượng, mặc dù bạn không thể khởi tạo nó trực tiếp, sau khi tất cả đại diện cho một đối tượng - do đó 'this'. – SimpleVar

+0

Chỉ cần làm rõ - những gì bạn đang làm ở đây là bảo người đó trang bị vũ khí, và người đó làm điều đó bằng cách bảo vũ khí trang bị cho người đó, và sau đó vũ khí thực sự trang bị cho người đó. Đó là PingPong #. – SimpleVar

+1

Có thể điều này sẽ giúp ích. Tinh thần tưởng tượng mọi phương thức sử dụng "this" bây giờ là một phương pháp * tĩnh *. Bây giờ thêm một tham số chính thức vào phương thức đó được gọi là '_this'. Tinh thần thay thế mọi 'this' bằng' _this'. Đối với các thuộc tính, hãy tưởng tượng chúng là các phương thức tĩnh 'static int get_Color (Shape _this) {return _this.color; } 'và tương tự cho setters. Trong một thế giới mà mọi phương pháp đều tĩnh và không ai sử dụng 'this', bạn có phản đối gì không? Bởi vì * về cơ bản nó hoạt động như thế nào *. 'this' chỉ là một quy ước có một tham số chính thức ẩn. –

Trả lời

5

Ràng buộc ngôn ngữ có nghĩa là bạn không thể tạo lớp trừu tượng trực tiếp, tuy nhiên hoàn toàn có thể có một thể hiện của nó - bạn chỉ cần tạo một thể hiện của lớp dẫn xuất và sau đó đưa nó xuống lớp trừu tượng.Một lớp trừu tượng cũng có thể có thực hiện trong nó, vì vậy việc sử dụng các từ khóa this là hoàn toàn bình thường và chấp nhận được.

0

Hãy xem điều này Microsoft on Abstract Keyword. Nó có nghĩa là để làm việc như thế. Chỉ vì bản thân đối tượng không thể được khởi tạo không có nghĩa là nó sẽ không bao giờ được khởi tạo. Thực tế, của bạn được bảo đảm để có lớp triển khai trước khi bạn có thể có thể tiếp cận từ khóa this trong mã của mình. Vì vậy, nó an toàn. (Khi bạn yêu cầu một Weapon từ danh sách Item của bạn, mà Weapon đã tới đã được thuyết minh trong mã của bạn. Có lẽ đến một Swords hoặc tương tự. Nếu không, bạn không bao giờ có thể truy cập vào nó để lưu trữ nó trong danh sách và vân vân)

Cuối cùng tôi sẽ lưu ý rằng cách bạn đang sử dụng lớp Weapon có thể hơi khó hiểu. Vì vậy, một tương tự ngắn tại điểm. Hãy suy nghĩ về nó theo cách này. Chỉ vì ý nghĩ, vung vũ khí, có nghĩa là không có gì không có vũ khí thực sự trong tay, không có nghĩa là nếu bạn cầm một vũ khí trong tay; nó đã không thể ám chỉ đến vũ khí đó.

Hy vọng nó hiện rõ hơn một chút.

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