C# 子类字段可以在父类中使用吗?

C# 子类字段可以在父类中使用吗?,c#,.net,oop,C#,.net,Oop,有没有办法在父类构造函数或方法中使用子类字段或属性 public class Parent { public Parent() { } } public class Child : Parent { public int y; public Child() { } } class Program { static void Main(string[] args) { Parent obj = new Ch

有没有办法在父类构造函数或方法中使用子类字段或属性

public class Parent
{
    public Parent()
    {

    }
}
public class Child : Parent
{
    public int y;
    public Child()
    {

    }
}
class Program
{
    static void Main(string[] args)
    {
        Parent obj = new Child();
        obj.y = 10;
    }
}
在上面的代码中,我无法访问字段“y”

不,您不能这样做。 这是因为ClassB的任何实例也是ClassA的实例,反之亦然


此外,如果上述语句不清楚,除非有充分的理由,否则最好避免父类依赖于子类的情况。

当您通过父类访问实例obj时,父类不了解y,您肯定无法访问该成员,因为它只在子类上定义

换句话说:每个孩子都是父母,都有y属性。但并不是每个父母都是孩子

因此,引用obj必须具有编译时类型Child,而不是Parent:


这是不可能的,因为您使用的是Parent类型的变量,并且Parent不公开属性y。

若要使用基类型的变量访问派生类型的成员,应将该变量显式强制转换为派生类型:

Parent parent = new Child();
Child child = (Child) parent;
child.y = 10;
但是你应该记住,Child=Childparent;如果父对象包含其他类型的对象,则可以引发运行时异常。例如,此代码引发运行时异常:

Parent parent = new AnotherChild();
Child child = (Child) parent;
使用is运算符可以避免运行时异常:

if (parent is Child) 
{
    Child child = (Child) parent;
    child.y = 10;
}
或者最好使用as运算符


as运算符从不引发异常。相反,如果无法强制转换对象,它将返回null。

否。从父对象继承的对象不一定具有int类型的属性y。事实上,这违反了Liskov替换原则,即实数形式的L。这一原则意味着我应该能够将从父级派生的任何类型的对象分配给该变量,并且逻辑应该工作。显然,如果我创建了一个名为Child2的类,该类继承自父对象,但没有y属性,或者将y声明为其他类型,例如DateTime,那么您的代码显然无法将值10分配给该对象实例


在某些情况下,您的父类可能会服从于子类。请参见虚拟和抽象方法及属性以获取示例。子类可能会通过考虑y的值来影响其中一个虚拟或抽象方法的行为,但是父类不能在不声明此类属性的情况下公开该y。

是的,您到底想要什么?请提供一个例子好吗?不使用子类实例是不行的,基类不应该知道它的派生类。我没有任何示例,因为这是在讨论C和OOPS概念时向我提出的一个问题。我试图编写代码,但在基类中使用子类字段时显示错误-您应该在问题中包含该代码。只是为了澄清,当您谈到父/子类时,您指的是类似于公共类父{}公共类子:父{},对吗?还是说像公共类父类{公共类子类{}这样的嵌套类?
if (parent is Child) 
{
    Child child = (Child) parent;
    child.y = 10;
}
Child child = parent as Child;
if (child != null)
{
    child.y = 10;
}