我有一个与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/