好,听我慢慢家伙,女孩我学习。这里是我的问题。

我无法找出为什么我不能重写从父类的方法。下面是从基类的代码(是的,我偷从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使抽象的类它几件事情的实现的问题:

  1. 您不能将新建立一个抽象类的一个实例。你必须使用一个子类。
  2. 您可以力所引起孩子实现某些方法。
  3. 所以,要做到这一点你结束了:

    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 virtualoverride在派生类,您的代码应工作。你确定你放置这些关键字属于他们的地方?下面是完整的码,即编译和运行得很好:

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方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top