C#面向对象编程:是否无需实例化每个类即可调用类成员?
无需实例化调用类成员的解决方法
当然有办法实现无需创建类实例就能调用成员的需求,核心是使用静态成员(static修饰符)——静态字段、静态方法属于类本身,而非类的某个实例,因此可以直接通过类名访问。
具体改造方案
1. 将成员标记为static
把需要直接调用的方法、字段加上static关键字,这样就不需要实例化类,直接通过类名访问。
2. 修改后的代码示例
namespace OOPattempt { class Skeleton { // 静态字段:属于类本身,所有关联类共享该值 public static int hp = 50; // 静态方法:直接通过类名调用 public static void Talking() { Console.WriteLine("Im a skeleton"); } } class Archer : Skeleton { public static void StateHP() { // 父类静态字段需通过父类名访问(静态成员不参与继承) Console.WriteLine("My hp is {0}", Skeleton.hp); } } class Gaurd : Skeleton { public static int attackDamage = 10; } class StrongArcher : Archer { public static void StrongArchDamage() { Console.WriteLine("I do more damage then the weak skeleton"); } } class WeakArcher : Archer { public static void WeakArchDamage() { Console.WriteLine("I do less damage then a stronger skeleton"); } } internal class Program { static void Main(string[] args) { // 无需创建任何实例,直接通过类名调用静态成员 Skeleton.Talking(); Archer.StateHP(); Console.WriteLine("Im a gaurd and my attack damage is {0}", Gaurd.attackDamage); WeakArcher.WeakArchDamage(); StrongArcher.StrongArchDamage(); } } }
注意事项
- 静态成员属于类,所有"实例"共享同一个值,如果需要每个角色拥有独立的属性(比如不同弓箭手的生命值不同),那还是得用实例成员,创建对象来区分。
- 静态成员不参与继承,子类不能直接通过子类名访问父类的静态成员,必须显式用父类名调用。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

