Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承问题_C#_.net - Fatal编程技术网

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”)
以避免将空参数与无法强制转换的合并。通常,我会将
保留为
,以便在需要处理空值且无法将强制转换为相同类型时使用。