【问题标题】:Access implemented class method [closed]访问实现的类方法[关闭]
【发布时间】:2014-10-08 20:08:01
【问题描述】:

我想问一个关于继承的问题。 我有两个从 AbsDoc 实现的类

public class A:AbsDoc
{
     public void SomeMethodA()
     {}
}


public class B:AbsDoc
{
     public void SomeMethod()
     {}
}

and one class to implement 

public class AbsDoc
{
     public void Doit(){};
     public void DoDiff(){};
}

当我需要访问这样的 A 类或 B 类方法时,我遇到了错误,我该如何访问

AbsDoc temp=null; 

if(param=="A)
{
  temp=new A();
}
else 
{
  temp=new B();
}

temp.SomeMethodA();//it gets error when i try to access 

【问题讨论】:

  • 这会导致编译时错误,因为 SomeMethodA() 仅存在于 A 上。AbsDoc 不知道 SomeMethod 或 SomeMethodA。因此,您要么需要将其转换为正确的类型,要么在基类中定义方法并在派生类中创建实现。
  • 你读过如何在 C# 中实例化新对象
  • 我已经阅读了如何在 C# 中实例化新对象,请您阅读下面我的评论,如果您知道该怎么做,请回答它

标签: c# oop


【解决方案1】:

temp 正如你所定义的那样,它是一个AbsDoc。它没有SomeMethodA,所以你会得到一个编译器错误。这是预期的。例如,再次查看您的代码:

AbsDoc temp=null; 

if(param=="A")
{
  temp=new A();
}
else 
{
  temp=new B();
}

temp.SomeMethodA();//it gets error when i try to access 

如果param != "A" 会发生什么?您的temp 将是B 而不是A,因此您不能调用SomeMethodA。如果你想调用SomeMethodA,你需要投temp:

AbsDoc temp=null; 

if(param=="A")
{
  temp=new A();
  ((A)temp).SomeMethodA();
}
else 
{
  temp=new B();
  ((B)temp).SomeMethod();
}

从您的评论看来,您想要做的事情是这样的:

AbsDoc temp=null; 

if(param=="A")
{
  var a =new A();
  a.SomeMethodA();
  temp = a;
}
else 
{
  var b =new B();
  v.SomeMethod();
  temp = b;
}

temp.DoIt();

这样你就不需要把所有基类的东西都做两次。

【讨论】:

  • 我想用一个变量(temp)完成每一项工作。这是上面代码的好方法吗?
  • 您没有提供足够的上下文来回答这个问题。您不能从类型为 AbsDoc 的变量中调用特定于 A 或 B 的方法或访问属性,除非您强制转换它。
  • 我知道我不访问属性或方法来转换 A 或 B 但如果 a create A tempA = new A() tempa.absdocmethod();和 B tempB=new B() tempB.absdocmethod() 我将写两次 absdoctmethod()。我想写一次你的答案对我来说已经足够了,但哪种方式最适合你?
猜你喜欢
  • 2019-06-25
  • 2015-02-25
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多