加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – oops概念查询

发布时间:2020-12-15 08:24:26 所属栏目:百科 来源:网络整理
导读:我有一个与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 Child
我有一个与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访问?

解决方法

回答你的第一个问题.

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

例如(常见场景 – 我经常使用),您可能有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的最佳方式.

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读