gpt4 book ai didi

C# 类类型转换

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:22 25 4
gpt4 key购买 nike

这是一个在线上很难解释的问题,但我会尽力而为。我已经实例化了一个 B 类型的对象,它存储在一个 A 类型的变量中。我使用 get 类型属性,所以现在它是 B 类型。因此我是否执行了类型 A 和 B 的隐式转换。所以因此当 a. show() 被称为是 B 型吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

class A
{
public virtual void show()
{
Console.WriteLine("Showing A");
}

public void test()
{
Console.WriteLine("called from A");
}
}

class B:A
{
public override void show()

{
Console.WriteLine("Showing B");
}

public void testb()
{
Console.WriteLine("called from B");
}
}
class Program
{
static void Main(string[] args)
{


A a = new B();
// Outputs ConsoleApplication.B
Console.WriteLine("{0}", a.GetType());
// outputs showing B
a.show();
// outputs called from A
a.test();

Console.ReadLine();
}
}
}

最佳答案

您还没有执行隐式转换,因为您实际上没有转换任何东西。

A a = new B();

你已经直接实例化了一个类型B的对象。你可以从类型A的变量中引用它,因为B是A的子类。但是,这两个 Action 应该被认为是独立的。

... = 新 B();

总是会实例化一个类型 B 的对象,不管左边是什么。

A a = ...

将始终尝试将右侧的内容分配给变量 a。

引用类型的唯一区别在于 CLR 如何看待对象。

A a = new B();
B b = new B();

两者都是 B 类型的对象。但是,'a' 只允许您像使用 A 类型的对象一样使用它。因此,您只能调用 a.show() 和 a.test() ,即使它实际上是 B 类型,所以也有额外的方法 testb()。 'b' 将允许您调用 b.show()、b.test() 和 b.testb()。无论变量类型如何,当您调用 show() 时,它都是 b 类型,因此返回的是覆盖的 show() 方法。

最后,你现在能做的就是垂头丧气。也就是说,您实例化了一个 B 类型的对象,因此您现在可以将它转换为一个 b 类型的变量,从而允许完全访问所有 B 类型的成员。

例如:

A a = new B();
a.testb(); // this will not compile as a does not have a definition of testb().

A a = new B();
B b = (B)a; // downcast a to a reference of type B
b.testb(); // this is now fine

我刚刚看到您提出了一个额外的问题,即为什么要将某些东西实例化为类型 A,即基类。这是为了提供一个共同点,作为处理不同类型对象的一种方式。例如,您可能有一个基类型 Animal,并从它派生出几个子类 - Cat、Dog、Gerbil。但是,您随后可能希望能够将所有 Animals 的列表传递给只需要使用公共(public)属性的方法。因此,如果 Animal 有名称,则可以迭代您的 List 并引用每个 Animals 名称,即使 Animal 本身可能是抽象的(无法实例化)并且列表完全由 Dogs、Cats 和 Gerbils 组成。然后,您还可以通过找出可以与它们进一步互动的类型来降低各种动物的情绪,例如

if (animal is Dog) {
Dog dog = (Dog)animal;
}

或者您可以使用“as”关键字进行转换:

Dog dog = animal as Dog;

希望这对您有所帮助。

关于C# 类类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9087340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com