2013-04-27 45 views
7

Tôi đã đọc một số thuộc tính và tôi không chắc chắn nếu đó là những gì tôi muốn hay không. Về cơ bản tôi có một lớp đạn trừu tượng để tất cả các "viên đạn" có một thực hiện chung Đó là bất kỳ "vũ khí" mà chúng được gắn vào có thể mong đợi để có thể sử dụng.Biến/thuộc tính trừu tượng? C#

Tôi biết bạn có thể khai báo một lớp trừu tượng và buộc các hàm bạn khai báo bên trong nó được xác định. Tôi muốn điều tương tự với các biến (tôi nghĩ, rõ ràng chức năng này dường như không tồn tại nên có lẽ tôi đang nghĩ về giải pháp sai)

Vấn đề của tôi là vì tất cả "đạn" nên có thiệt hại tôi muốn bị buộc phải khai báo trong mã giá trị thiệt hại của một viên đạn.

Có thể có trường hợp vòng đấu từ súng stun và nó không gây sát thương nhưng tôi cảm thấy rằng tôi vẫn cần phải khai báo nó vì 2 lý do.

  1. Khai báo rõ ràng trong mã này không gây thiệt hại nào đáng giá một dòng mã. Bạn không cần phải đi tốt Tôi đoán nó không có gì vì nó không nói gì về thiệt hại nó được tuyên bố rõ ràng.

  2. Gỡ lỗi (đây là lý do chính khác là trẻ vị thành niên) Tôi muốn bị ép buộc, vì vậy tôi không quên. Tôi không muốn nhập nhầm tên biến hoặc quên gán giá trị hoàn toàn và tìm kiếm một nửa giờ cố gắng tìm ra lý do tại sao tên lửa hoặc tên lửa hoặc viên đạn của tôi hoặc bất kỳ thứ gì không thực hiện bất kỳ thiệt hại nào hoặc đang thực hiện chính xác 1 hoặc số tiền của đạn cuối cùng tôi đã sử dụng hoặc bất cứ giá trị mặc định nào của biến float mà tôi khai báo trong lớp trừu tượng kết thúc bằng. Tôi muốn bị ném một lỗi ngay lập tức nói với tôi rằng tôi không thể tiếp tục cho đến khi viên đạn mới của tôi bị hư hại.

Trả lời

9

Thuộc tính là những gì bạn đang tìm kiếm. trên một giao diện bạn chỉ có thể làm một cái gì đó như thế này:

public interface IProjectile 
{ 
    string Name { get; } 

    int Damage { get; } 

    void Fire(); 
} 

Chỉ get phương pháp này phải được xác định trên giao diện vì bạn chỉ cần cho người tiêu dùng của giao diện để đọc từ tài sản thiệt hại, và bạn muốn không cho phép người tiêu dùng ghi giá trị thiệt hại.

Việc thực hiện sẽ là một cái gì đó như thế này:

public class Bullet : IProjectile 
{ 
    public string Name { get { return "Bullet"; } } 
    public string Damage { get { return 5; } } 

    public void Fire() 
    { 
     Console.WriteLine("Did {0} damage.",Damage); 
    }  
} 
+0

Điều này cũng có thể được thực hiện với một lớp 'abstract' (mà _might_ phù hợp với nhu cầu của user53961), chỉ cần khai báo thuộc tính' Damage' là 'abstract'. EDIT: Chỉ cần được rõ ràng mặc dù, tôi ủng hộ cách tiếp cận giao diện trong trường hợp này. (bởi vì một game nhập vai có động lượng và vật lý được coi là "viên đạn"?) –

3

Tôi nghĩ bạn nên đi với cách tiếp cận giao diện từ câu trả lời của Nathan. Nhưng có thể khai báo các thuộc tính trừu tượng.

public abstract class Bullet 
{ 
    public abstract int Damage { get; set; } 
} 

public class SomeBullet : Bullet 
{ 
    public override int Damage { get; set; } //This has to be implemented. 
    ... 
} 
+3

Lưu ý rằng thậm chí có thể bỏ qua yêu cầu 'set' và triển khai trả về một giá trị cố định. Ví dụ, 'SomeBullet' có thể có:' public override int Damage {get {return 5; }} ' –

8

Dưới đây là chi tiết hơn một chút về cách thực hiện điều này:

public abstract class Projectile { 
    public Name { get{return GetType().Name;} } 
    public abstract int Damgage { get; } 
} 

public Bullet202: Projectile { 
    public override int Damage { get{return 5;} } 
} 

public Bullet303: Projectile { 
    public override int Damage { get{return 8;} } 
} 

Phân biệt giữa việc sử dụng một giao diện hoặc một lớp trừu tượng để làm căn cứ: Một lớp trừu tượng ia một chia sẻ thực hiện, một giao diện là hợp đồng được chia sẻ. Họ chia sẻ một số điểm chung, nhưng đáp ứng các yêu cầu khác nhau.Ví dụ, bạn có thể muốn chia sẻ yêu cầu (một giao diện chung IProjectile) giữa vũ khí nhỏ và nặng hơn, hoặc giữa các vũ khí gây chết người và không gây tử vong, đồng thời thực hiện ba loại trên ba lớp trừu tượng khác nhau (LethalSmallArms, NonLethalSmallArmsHowitzers) tất cả đều triển khai giao diện chung IProjectile.

+1

Tôi đã thích cách tiếp cận này hơn. Điểm mấu chốt của nó sẽ là: "cho bất kỳ lớp con nào, kế thừa hợp đồng từ giao diện và triển khai từ lớp cơ sở trừu tượng, trong khi cả hai phải được giữ _independent_ với nhau (ngay cả khi ngữ nghĩa liên quan)." – heltonbiker

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