C# 子类的属性不可见

C# 子类的属性不可见,c#,.net,inheritance,properties,C#,.net,Inheritance,Properties,在C#4.0中,我有一个父类和一个子类,与此类似: public abstract class Parent() { public Parent() { } public void CommonMethod() { /* do something */ } } public class Child : Parent { public string PropertyA { get; set; } public string PropertyA { get; set; }

在C#4.0中,我有一个父类和一个子类,与此类似:

public abstract class Parent()
{
   public Parent() { }

   public void CommonMethod() { /* do something */ }
}

public class Child : Parent
{
   public string PropertyA { get; set; }
   public string PropertyA { get; set; }

   public Child() : base()

}
如果我实例化以下内容:

Parent obj = new Child();
Child obj = new Child();
…我无法访问
属性a
属性b
。我意识到
obj
属于
Parent
类型,没有这些成员,但我如何才能以“干净”的方式访问它们?我可以做到以下几点:

Parent obj = new Child();
Child obj = new Child();
…这会给我访问权限,但我经常看到对象被输入到父对象而不是子对象。为什么这种情况如此普遍?我走错方向了吗


编辑:我应该说Child()中的属性不是所有从Parent()派生的类所共有的。

在父类中声明这些属性,如下所示:-

public abstract class Parent()
{
   public Parent() { }
   public string PropertyA { get; set; }
   public string PropertyA { get; set; }
}
更新:-

我建议将您所有的抽象类代码转移到一个接口,并在那里声明属性,在您需要的任何地方使用child中的接口,如果主要关注的是child,则按照其他人的建议使用child中的接口,然后创建
child
的实例,而不是
parent

接口如下:-

public interface IParent
{
   // interface members
       string PropertyA { get; set; }
       string PropertyA { get; set; }
}

如果这些属性对于所有派生类型都是公共的,那么应该在基类中声明它们

如果它们对于某些派生类型是通用的,那么将它们放入
接口中
,并从派生类实现该接口

如果它们只特定于
Child
类,那么您没有太多选择,可以将实例声明为
Child
not
Parent
,或者检查类型并适当地强制转换它

我经常看到对象被输入到父对象而不是子对象。为什么这种情况如此普遍

如果你不需要它,就不要使用它。显然你的
孩子
的财产很重要;然后将您的
obj
声明为
Child
,而不是
Parent

相反,如果您实际上只关心
Parent
成员,则使用
Parent
声明

如何以“干净”的方式访问它们

通过铸造:

Parent obj = new Child();
((Child)obj).PropertyA = "foo";

但是并不是每个
家长都必须是
孩子

您需要像下面这样更改调用方法
父对象=新子对象();->是你的吗

需要像这样`

Parent obj=new Parent();  or Child obj=new Child();
在您的父类中,更改类如下:

 public string PropertyA { get; set; }


public string PropertyB { get; set; }
在您的基类中,需要使用相同的方法


派生类需要与父类类似这是第二种方法。

您从
父类定义了一个对象,但
新的
对象是从
子类定义的。因此,每当您为
obj
调用任何方法或属性时,程序都会引用
父类
来查找它们,但它无法在
父类
中找到这些属性,因为您没有覆盖它们

public abstract class Parent()
{
  public Parent() { }

  public void CommonMethod() { /* do something */ }

  abstract public PropertyA {get; set;}
  abstract public PropertyB {get; set;}
}

public class Child : Parent
{
   override public string PropertyA { get; set; }
   override public string PropertyA { get; set; }

   public Child() : base()

}

它们并不常见;我应该说明这一点。问题已更新。问题是财产A和财产B不是父母的所有子女所共有的。你是说有些子女拥有这些财产,有些则不正确@约翰·马克·史密斯