Ami*_*mit 6 .net c# oop polymorphism
我有一个与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";
}
}
Run Code Online (Sandbox Code Playgroud)
public class ChildClass : BaseClass
{
public int i = 20;
public int z = 90;
public override string Hello()
{
return "Hello of child class called";
}
}
Run Code Online (Sandbox Code Playgroud)
现在我已经看到下面的代码工作正常
BaseClass baseObject = new ChildClass();
Run Code Online (Sandbox Code Playgroud)
当我输入时,我baseObject.只看到成员BaseClass
.
第一个问题:有人可以告诉我开发人员需要这样做的情况BaseClass baseObject = new ChildClass();
吗?
第二个问题:如果我的BaseClass
对象有对我的子类对象的引用,那么为什么我的子成员变量无法通过它访问baseObject
?
回答你的第一个问题.
开发人员这样做是为了提供他们所指的实际对象的抽象,这为使用它的代码提供了灵活性和"松散耦合".
例如(常见场景 - 我经常使用),您可能有10个扩展基类的子类.如果您想要一种方法来返回每种类型的子类,该怎么办?好吧,如果没有这种类型的声明,你需要10种方法.但是如果指定了返回类型"BaseClass",则可以从一个方法返回所有10种类型的子类.该技术与接口用户密切相关.
例如
public BaseClass GetDynamicChildClass()
{
if (someCondition) return ChildClass();
else if (someOtherCondition) return SomeOtherChildClass();
}
Run Code Online (Sandbox Code Playgroud)
回答你的第二个问题.
您无法看到子属性,因为您说"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;
Run Code Online (Sandbox Code Playgroud)
这种类型的概念(多态)是面向对象编程的基础.看看这个优秀的StackOverflow问题:尝试尽可能简单地描述多态
它以最简单的方式解释它,而不是将其绑定到任何特定的编程框架,在我看来,这是学习OO的最佳方式.
希望有所帮助.