2014-02-17 91 views
0

基类:如何在子类中使用基类覆盖ToString()方法?

namespace inheritance 
{ 
    public abstract class Shape 
    { 
     private string shapeId; 
     private float length; 

     public Shape(string s) 
     { 
      shapeId = s; 
     } 

     public string Id 
     { 
      get 
      { 
       return shapeId; 
      } 
      set 
      { 
       shapeId = value; 
      } 
     } 

     public abstract double Area 
     { get; 
     } 

     public override string ToString() 
     { 
      return Id + "Area = " + string.Format("{0:F2}", Area); 
     } 
    } 
} 

正如你所看到的,我已经覆盖了ToString方法。

这是我的子类:

namespace inheritance 
{ 
    public class Circle : Shape 
    { 
     private double area; 

     public Circle(string s) : base (s) 
     { 
      //ShapeId = s; 
     } 

     public override double Area 
     { 
      get 
      { 
       area = 50 * 50 * Math.PI; 

       return area; 
      } 
     } 
    } 
} 

这是我的主:

namespace inheritance 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Shape circle = new Circle("circle"); 
      circle.ToString(); 
      Console.Read(); 
     } 
    } 
} 

问题是,当我称之为ToString方法,没有打印到控制台。我正在进行实践练习,但是一些示例代码的说明很糟糕。基类是示例代码,缺乏相当多的可用(例如,必须在变量中进行硬编码)。我会添加更多的变量,但这个练习的重点是继承,我试图确定我是否愚蠢或缺少指令。

我曾经学习Java,也想知道我是否正确创建了Area方法,例如使用get{}set{}ToString方法与以下相反还有什么意义?

Console.WriteLine("bla bla bla"); 
+0

你的意思'Console.WriteLine(circle.ToString());'(了'的ToString()'甚至没有的方式需要) –

回答

4

行:

circle.ToString(); 

只有回报一个字符串,它不打印任何东西到控制台。你想:

Console.WriteLine(circle); 

注意,WriteLine隐含的调用ToString()所以没有理由去称呼它,但你可以的,如果你的愿望。

2

什么都不打印到控制台,因为你不打印任何地方任何地方。您的覆盖范围ToString方法根本不打印到控制台。

Console.WriteLine(circle.ToString()); 

这就是你所需要的。

0

当我调用toString方法时,没有任何内容输出到控制台。

这是因为ToString方法简单地返回一个string对象。没有其他行为被执行(也不一定,他们应该是)。要将任何内容打印到控制台,您必须使用Console.WriteConsole.WriteLine。 (两者之间的区别是最后出现换行符)正如你所说你有使用Java的经验,这与System.out.printSystem.out.println完全相同。

我以前学习java,也想知道我是否正确使用了area方法,例如get {}和set {}。

那些不是方法,而是属性。它们与创建一个名为getXXXXsetXXXX的Java Bean类相同。你当然可以把代码放进去(事实上,添加代码是写比如public string Id { get; set; }多的唯一理由,作为空非抽象的getter/setter将在编译时自动生成),但它的非常少见就像你用Area完成的那样,看到一个修改字段的getter。从技术上讲,你每次设置area以同样的事情,但在现实世界的环境,我不希望var a = myCircle.Area使任何修改myCircle

考虑另一位程序员在Java中会发生什么,如果他们叫myObj.getThunk()myObj.setThunk(myThunk)。在C#getters/setters中实现相同的行为。

也什么在toString方法点到并列:

Console.WriteLine("bla bla bla"); 

如上所述,ToString返回string值。您可以将它存储在一个变量中,将它传递给其他方法等。WriteLine将输入字符串打印到控制台,并且不返回任何内容。如果WriteLine被赋予了非string值,它会尝试自动调用该值ToString