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.
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
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
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. –