【问题标题】:What is happening with Polymorphism in C#C# 中的多态性发生了什么
【发布时间】:2011-12-13 23:12:44
【问题描述】:

我有一个接口 [a] 和一个实现类 [b]。 [b] 除了已实现的方法之外,还有自己的方法。

//-----------
public interface a
{
void functionA();
}
//-----------

public class b:a
{
void functionA(){}
void functionB(){}

}
//------------

在解决方案内的项目 X 中。当我编码时:[项目是一个类库]

a test = new b();
test.functionB(); //It Works

在另一个项目中引用了库 [控制台应用程序]

a test = new b();
test.functionB(); //Error CS1061 --> a doesn't have a method called function b

对不起,名字是西班牙语。界面:pastebin.com/Unm5Adkd,实现者:pastebin.com/wmikck9H,程序:控制台应用:pastebin.com/Yus91hQL...谢谢大家的帮助。 :P

【问题讨论】:

  • 它们都不应该工作; a 没有名为 functionB 的方法。
  • 有效的代码示例有误。如果有扩展方法,您提供的代码应该只编译第一个示例。您提供的代码本身不会编译该示例。您是否省略了一些代码?
  • 您是否使用“var”关键字声明第一个示例?我认为您需要发布一个完整的示例来说明您的问题。
  • -1 直到第一个样本处于可编译状态(或至少不会产生明显的“a没有函数B”)
  • 我刚刚发布了 3 类的 pastebin 看原帖。我当然不编译。但是,如果我实现一个接口,我不必只有接口方法,我作为一个类可以有更多方法。多态性很好,但在项目之外是一团糟。我错过了什么吗?

标签: c# .net oop polymorphism


【解决方案1】:

我假设您在问为什么会收到 CS1061 错误。

这很简单。在您的控制台应用程序中,即使您实例化了一个“b”类型的对象(“new b()”),您似乎也将它分配给了一个引用“a”的变量。根据您的示例,接口“a”确实不包含名为“functionB()”的方法。

在这种情况下,您有两个选择。

选项一也将方法'functionB()'添加到接口定义中:

public interface a {
   void functionA(){}
   void functionB(){}
}

选项二是确保控制台应用程序中的变量“a”是“b”类型:

b a = new b();
a.functionB();

在旁注中,我建议坚持普遍接受的命名准则,例如类和方法的名称以大写字母开头。

【讨论】:

  • 感谢您的回复。现在让我们说父亲和孩子。尽管 Base 没有该方法,但该对象被构建为 Child。代码: Base a = new Child();在当前项目(类库)中工作,该方法也显示在智能感知自动完成中。问题出在控制台应用程序中的该项目之外。我不明白,因为已经设置了参考。
  • 我认为您需要提供更多上下文,例如库和控制台应用程序的更多源代码。否则也有可能出现问题的选项。
  • 该项目是出于教育目的,所以我可以发布源代码,但我可以将它上传到 IDK pastebin 并将链接放在这里吗?
  • 您可以这样做,但我不能保证任何具体的响应时间。
  • 哦,嘘……现在我明白了。当我说:Father a = new Child() 时,我只能使用父亲定义的方法。那是一种保护,我只是用父子类在java中进行测试。还使用 Object 和 Child 进行了测试。我的坏人。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2012-01-20
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多