网站大全网址大全,网页设计与制作总结报告800字,网站模板怎样使用,微官网怎么制作文章目录 1、Animal objDog new Dog()和 Dog objDog new Dog()的区别1. **对象类型#xff08;引用类型#xff09;**2. **调用和可用成员**3. **示例代码来说明**使用示例总结 2、Animal objDog new Dog();不能调用dog的方法和属性是为什么#xff1f;原因解析解决方法小… 文章目录 1、Animal objDog new Dog()和 Dog objDog new Dog()的区别1. **对象类型引用类型**2. **调用和可用成员**3. **示例代码来说明**使用示例总结 2、Animal objDog new Dog();不能调用dog的方法和属性是为什么原因解析解决方法小结 1、Animal objDog new Dog()和 Dog objDog new Dog()的区别
在 C# 语言中Animal objDog new Dog(棒棒, 黑色, 小黑狗, 排骨); 和 Dog objDog new Dog(棒棒, 黑色, 小黑狗, 排骨); 的区别主要体现在对象的类型引用类型和可用的成员方法、属性。具体来看
1. 对象类型引用类型 Animal objDog new Dog(...) 这里objDog 是一个父类 Animal 类型的引用指向了一个 Dog 类型的实例。因为 objDog 的类型是 Animal你只能访问在 Animal 类中定义的方法和属性包括虚拟方法。你可以通过 objDog 调用 Animal 中的虚拟方法如果有重写但不能直接访问 Dog 类中特有的方法和属性如果没有显式转换。 Dog objDog new Dog(...) 这里objDog 是 Dog 类型的引用指向的是一个 Dog 的实例。可以访问 Dog 类中所有的方法和属性包括父类 Animal 中的方法因为 Dog 继承自 Animal。
2. 调用和可用成员 使用 Animal 类型引用 只能调用 Animal 中的成员且如果 Animal 中有虚拟方法并在 Dog 中重写了实际调用时会执行 Dog 中重写的方法。例如如果 Animal 类有一个虚拟方法 Speak()你可以这样调用objDog.Speak(); // 如果在 Dog 中重写了 Speak() 方法会调用 Dog 的实现。使用 Dog 类型引用 可以直接调用 Dog 中的所有方法和属性包括 Animal 类定义的成员。例如objDog.Bark(); // 直接调用 Dog 类特有的方法3. 示例代码来说明
假设我们有如下类定义
public class Animal
{public string Name { get; set; }public string Color { get; set; }public Animal(string name, string color){Name name;Color color;}public virtual void Speak(){Console.WriteLine(${Name} speaks!);}
}public class Dog : Animal
{public string Breed { get; set; }public string FavoriteFood { get; set; }public Dog(string name, string color, string breed, string favoriteFood): base(name, color){Breed breed;FavoriteFood favoriteFood;}public override void Speak(){Console.WriteLine(${Name} (a {Breed}) barks!);}public void Bark(){Console.WriteLine(${Name} is barking!);}
}使用示例
Animal objDog1 new Dog(棒棒, 黑色, 小黑狗, 排骨);
objDog1.Speak(); // 输出: 棒棒 (a 小黑狗) barks!
objDog1.Bark(); // 编译错误: objDog1没有Bark方法Dog objDog2 new Dog(棒棒, 黑色, 小黑狗, 排骨);
objDog2.Speak(); // 输出: 棒棒 (a 小黑狗) barks!
objDog2.Bark(); // 输出: 棒棒 is barking!总结
使用父类类型的引用Animal objDog可以提高程序的灵活性适合处理多态性但访问成员的限制较多。使用子类类型的引用Dog objDog允许你访问所有相关成员适合需要直接使用子类特有功能的场景。
2、Animal objDog new Dog();不能调用dog的方法和属性是为什么
在 C# 中Animal objDog new Dog(); 这行代码的主要作用是将一个 Dog 对象赋值给一个 Animal 类型的引用变量 objDog。虽然 objDog 实际上引用的是一个 Dog 对象但由于它的类型是 Animal你只能访问 Animal 类中定义的方法和属性而不能调用 Dog 类中特有的方法和属性。
原因解析 类型限制 objDog 被声明为 Animal 类型因此编译器只允许你访问 Animal 类中定义的 public 和 protected 方法和属性。即使它在运行时指向一个 Dog 对象编译器并不知道除非你将其转换为 Dog 类型。 方法和属性的可见性 如果 Dog 类中有只在 Dog 类中定义的方法或属性如 Bark()这些方法和属性在 Animal 类中是不可见的因此你无法直接通过 objDog 调用它们。
解决方法
如果你需要调用 Dog 类中特有的方法和属性可以将 objDog 类型转换为 Dog如下面的代码示例所示
public class Animal
{public string Name { get; set; }public string Color { get; set; }public Animal(string name, string color){Name name;Color color;}public virtual void Speak(){Console.WriteLine(${Name} speaks!);}
}public class Dog : Animal
{public string Breed { get; set; }public string FavoriteFood { get; set; }public Dog(string name, string color, string breed, string favoriteFood) : base(name, color){Breed breed;FavoriteFood favoriteFood;}public override void Speak(){Console.WriteLine(${Name} (a {Breed}) barks!);}public void Bark(){Console.WriteLine(${Name} is barking!);}
}// 使用示例
Animal objDog new Dog(棒棒, 黑色, 小黑狗, 排骨);
// objDog.Bark(); // 编译错误因为 Animal 类型没有 Bark 方法// 类型转换
if (objDog is Dog dog)
{dog.Bark(); // 正确调用 Dog 类中特有的方法
}小结
使用 Animal objDog new Dog(); 时objDog 的类型是 Animal只能使用 Animal 中定义的方法和属性。若想使用 Dog 类中特有的方法和属性需要将其转换为 Dog 类型。这可以通过 is 关键字或显式转换来实现。