题
好,听我慢慢家伙,女孩我学习。这里是我的问题。
我无法找出为什么我不能重写从父类的方法。下面是从基类的代码(是的,我偷从OOP书的Java代码,我试图重写它在C#)。
using System;
public class MoodyObject
{
protected String getMood()
{
return "moody";
}
public void queryMood()
{
Console.WriteLine("I feel " + getMood() + " today!");
}
}
和这里是我的其他2个对象继承该基类(MoodyObject):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class SadObject: MoodyObject
{
protected String getMood()
{
return "sad";
}
//specialization
public void cry()
{
Console.WriteLine("wah...boohoo");
}
}
}
和
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class HappyObject: MoodyObject
{
protected String getMood()
{
return "happy";
}
public void laugh()
{
Console.WriteLine("hehehehehehe.");
}
}
}
和这里是我的主要:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MoodyObject moodyObject = new MoodyObject();
SadObject sadObject = new SadObject();
HappyObject happyObject = new HappyObject();
Console.WriteLine("How does the moody object feel today?");
moodyObject.queryMood();
Console.WriteLine("");
Console.WriteLine("How does the sad object feel today?");
sadObject.queryMood();
sadObject.cry();
Console.WriteLine("");
Console.WriteLine("How does the happy object feel today?");
happyObject.queryMood();
happyObject.laugh();
}
}
}
正如你所看到的,很基本的东西,但这里的输出:
如何穆迪对象今天感觉如何? 我今天感觉喜怒无常!
如何悲伤的对象今天感觉如何?一世 今天感觉喜怒无常!华...号泣
如何幸福的对象今天感觉如何? 我今天感觉喜怒无常! hehehehehehe。 按任意键继续 。 。
不作为我的预期。我试图使基虚拟方法,并试图覆盖它,这只是让我这个错误时调用覆盖“不能覆盖继承成员‘MoodyObject.getMood()’,因为它未标记的虚拟,抽象或重写”。我也试了一下没有虚拟和超越,它认为我试图隐藏基本方法。同样,我是新来的OOP并希望任何指导。
编辑补充:我找到了!该MoodyObject.cs只是在解决方案资源管理“解决方案项目”,而不是一个“ConsoleApplication1”项目。我拖下来到它在Solution Explorer中,瞧属于!它现在。我标志着吕克的回答下面的答案,因为他提供了我需要去的地步,我已经解决了它......我学习这么多在这里帮助。这是惊人的,你们女生都疯了聪明!
解决方案
在C#方法不是通过默认的虚拟,因此,如果设计一些方法重写的,则应该将其指定为虚拟:
class Base
{
protected virtual string GetMood() {...}
}
其次,必须指定要打算从派生的类的基类重写方法。
class Derived : Base
{
protected override string GetMood() {...}
}
如果你不指定“覆盖”的关键字,你会得到方法,隐藏基本类型(从编译器警告把“新”关键字的方法明确说明的话)。
如果要停止继承链并禁止该方法的进一步替换值,则应该密封,这样标记方法:
protected sealed override string GetMood() {...}
其他提示
您需要使用override关键字覆盖任何虚拟或实现任何抽象方法。
public class MoodyObject
{
protected virtual String getMood()
{
return "moody";
}
public void queryMood()
{
Console.WriteLine("I feel " + getMood() + " today!");
}
}
public class HappyObject : MoodyObject
{
protected override string getMood()
{
return "happy";
}
}
我会在这里推荐的是,你probally意味着MoodyObject是一个抽象类。 (你必须,如果你这样做,但你应该探索它改变你的主要方法)是否真的有意义是在一个喜怒无常的模式?与我们上面有什么是你HappyObject不需要提供getMood.By使抽象的类它几件事情的实现的问题:
- 您不能将新建立一个抽象类的一个实例。你必须使用一个子类。
- 您可以力所引起孩子实现某些方法。 醇>
所以,要做到这一点你结束了:
public abstract class MoodyObject
{
protected abstract String getMood();
public void queryMood()
{
Console.WriteLine("I feel " + getMood() + " today!");
}
}
请注意您如何不再为getMood的实现。
据我所知,在Java中所有的方法都是通过默认的虚拟。这是不是与C#的情况下,所以你需要先用“虚拟”的,例如基类的方法protected virtual string getMood() ...
并用“覆盖”替换值,例如protected override string getMood()...
。
如果要重写基类的方法,它需要被声明为virtual
。在派生类中覆盖方法必须显式声明为override
。这应该工作:
public class BaseObject
{
protected virtual String getMood()
{
return "Base mood";
}
//...
}
public class DerivedObject: BaseObject
{
protected override String getMood()
{
return "Derived mood";
}
//...
}
修改强>我只是想它在C#控制台应用程序,并将其编译。所以,你使用源代码应该在一些微小但重要的一块,从你张贴在这里有什么不同。
我Program.cs是这样的:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// leaving out your implementation to save space...
}
}
public class SadObject : MoodyObject
{
protected override String getMood()
{
return "sad";
}
//specialization
public void cry()
{
Console.WriteLine("wah...boohoo");
}
}
public class HappyObject : MoodyObject
{
protected override String getMood()
{
return "happy";
}
public void laugh()
{
Console.WriteLine("hehehehehehe.");
}
}
}
您需要告诉你的对象是从基类中重写功能的C#。
下面是关于语法的MSDN文章,你需要:的 http://msdn.microsoft.com/en-us/library/ebca9ah3(VS.71)的.aspx
public class SadObject: MoodyObject
{
override String getMood()
通过使在穆迪你的方法GetMood virtual
和override
在派生类,您的代码应工作。你确定你放置这些关键字属于他们的地方?下面是完整的码,即编译和运行得很好:
public class MoodyObject
{
protected virtual String getMood()
{
return "moody";
}
public void queryMood()
{
Console.WriteLine("I feel " + getMood() + " today!");
}
}
public class SadObject : MoodyObject
{
protected override String getMood()
{
return "sad";
}
//specialization
public void cry()
{
Console.WriteLine("wah...boohoo");
}
}
public class HappyObject : MoodyObject
{
protected override String getMood()
{
return "happy";
}
public void laugh()
{
Console.WriteLine("hehehehehehe.");
}
}
class Program
{
static void Main(string[] args)
{
MoodyObject moodyObject = new MoodyObject();
SadObject sadObject = new SadObject();
HappyObject happyObject = new HappyObject();
Console.WriteLine("How does the moody object feel today?");
moodyObject.queryMood();
Console.WriteLine("");
Console.WriteLine("How does the sad object feel today?");
sadObject.queryMood();
sadObject.cry();
Console.WriteLine("");
Console.WriteLine("How does the happy object feel today?");
happyObject.queryMood();
happyObject.laugh();
Console.Read();
}
}
也许你的错误来自于一个事实,在Java中,所有的方法都是虚拟的,这是不是这种情况是C#(如丹Ç指出。)。
public class SadObject: MoodyObject
{
override String getMood()
您需要与“覆盖”关键字标记getMood的覆盖。你还需要标记与“虚拟”的关键字的基础getMood方法。