C# 继承问题
我的班级结构是这样的C# 继承问题,c#,.net,C#,.net,我的班级结构是这样的 Class A { } Class B:A{..} Class Demo { //Here Actual Parameter is instance of Class B. But in xyz function accepts // parameter of type Class A. So in Below function can i get the Properties of //Class B by using "((B)a
Class A
{
}
Class B:A{..}
Class Demo
{
//Here Actual Parameter is instance of Class B. But in xyz function accepts
// parameter of type Class A. So in Below function can i get the Properties of
//Class B by using "((B)a).Property_Name", But i don want to specify the Name
//of Class B. So is ther any approach to meet my need.
public void xyz(A a){ ....Here I Can i get }
}
你们错过的一点是B是A的派生类 这意味着B已经可以访问A的属性,所以您不需要强制转换 您只需将B参数传递给XYZ函数,该函数接受A,然后您就可以使用
a
调用A的属性
另一方面,如果您试图访问的私人财产的。。。这在A类之外是不可能的,被认为是逻辑错误
现在不同的情况是,如果您将B类型参数传递到XYZ中,并且希望访问B的属性,那么您必须将其强制转换为B,因为A是在B之前创建的,所以它不知道B的特定属性和方法 听起来您想在一个将
a
作为参数的方法中使用B
中不存在的成员。您不希望将成员移动到A
,因为这样做可能没有意义,而且当传入B时,您需要一些特殊的东西
最直接的方法是测试它
public void xyz(A a){
if (a is B)
{
((B)a).dosomthing()
}
}
然而这是不好的,因为也许你有C,需要这个
那么最好引入一个接口,例如
B:A,是的
public void xyz(A a){
if (a is ISomthing)
{
((ISomthing)b)dosomthing()
}
}
另一个选项是使用否您无法从类型A的obj访问B的成员,请想想,如果A具有属性X和Y,而B具有属性Z,您将如何强制转换它并提供Z的值?CLR可能不知道,您必须更改方法签名以获取类型为B的参数才能完成此操作。或者,如果您完全知道A的所有案例应如何转换为B,您可以实施自己的转换操作来处理该问题。zenwalker@抱歉,我更正了我的问题。现在检查一下。这是一个令人沮丧的朋友,不是一个好的设计。所以我应该改变设计。你能给我建议一个最好的方法吗?你的问题毫无意义。它已经是一个
A
。只要在上面调用A
的成员就行了。@Andrew Barber,他说,在调用时,他确实喜欢这样B=new B(),然后他需要使用B的属性。所以绝对向下转换“您将如何转换它并提供Z的值”--像这样((B)a)。Property_Name
是的,您是正确的,它将编译并可能工作,但是,该方法采用类型a,不能保证传递的类型是类型B(如果有,那么我认为他应该改为类型B)。如果他真的想这样做,imho,使用“as”cast操作符并执行null检查或执行接口实现(如您在解决方案中所建议的)实际上会比前者更好这是关于as
的一个好观点,但是在这种情况下,我可能会添加If(a==null)抛出新的ArgumentNullException(“a”)
以避免将空参数与无法强制转换的合并。通常,我会将保留为
,以便在需要处理空值且无法将强制转换为相同类型时使用。