我有一个与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";
   }
}

我有一个 child 类
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访问我的子成员变量?

最佳答案

回答您的第一个问题。

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

例如(常见情况-我经常使用),您可能有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

它以最简单的方式对其进行了解释,而没有将其绑定(bind)到任何特定的编程框架上,我认为这是学习面向对象的最佳方法。

希望能有所帮助。

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

10-11 23:40