C# 子类的属性不可见
在C#4.0中,我有一个父类和一个子类,与此类似: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; }
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
notParent
,或者检查类型并适当地强制转换它
我经常看到对象被输入到父对象而不是子对象。为什么这种情况如此普遍
如果你不需要它,就不要使用它。显然你的孩子
的财产很重要;然后将您的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不是父母的所有子女所共有的。你是说有些子女拥有这些财产,有些则不正确@约翰·马克·史密斯