gpt4 book ai didi

c# - oops概念查询

转载 作者:太空狗 更新时间:2023-10-29 21:10:59 25 4
gpt4 key购买 nike

我有一个与 OOPS 概念相关的问题。

我有一个基类

public class BaseClass
{
public int i = 10;
public int x = 30;
public string str = "Hello";
public virtual string Hello()
{
return "Hello of base class called";
}
}

我有一个子类

public class ChildClass : BaseClass
{
public int i = 20;
public int z = 90;
public override string Hello()
{
return "Hello of child class called";
}
}

现在我看到下面的代码工作正常

BaseClass baseObject = new ChildClass();

当我键入 baseObject. 时,我只会看到 BaseClass 的成员。

第一个问题:在开发人员需要执行此操作的情况下,有人可以建议我吗 BaseClass baseObject = new ChildClass();

第二个问题:如果我的 BaseClass 对象引用了我的子类对象,那么为什么我的子成员变量不能通过这个 baseObject 访问?

最佳答案

回答您的第一个问题。

开发人员这样做是为了提供对他们所引用的实际对象的抽象,这为使用它的代码提供了灵 active 和“松散耦合”。

例如(常见场景——我经常使用),您可能有 10 个扩展基类的子类。如果您想要一个方法来返回每种类型的子类怎么办?好吧,如果没有这种类型的声明,您将需要 10 个方法。但是如果你指定了“BaseClass”的返回类型,你可以从一个方法中返回所有10种类型的子类。这种技术与界面的用户密切相关。

例如

public BaseClass GetDynamicChildClass()
{
if (someCondition) return ChildClass();
else if (someOtherCondition) return SomeOtherChildClass();
}

回答你的第二个问题。

您看不到子属性,因为您说过“baseObject”的类型是“BaseClass”——编译器已将对象类型化为这个。为了访问子属性,您需要将其转换为子类型:

BaseClass b = new ChildClass();
int x = b.z; // error.
int x = ((ChildClass)b).z; // works - this is a cast, throws exception in bad conversion
ChildClass c = b as ChildClass; // also works, different type of cast, returns null in bad conversion
int x2 = c.z;

这种类型的概念(多态性)是面向对象编程的基础。看看这个优秀的 StackOverflow 问题:Try to describe polymorphism as easy as you can

它以最简单的方式对其进行了解释,而没有将其束缚于任何特定的编程框架,我认为这是学习 OO 的最佳方式。

希望对您有所帮助。

关于c# - oops概念查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723647/

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