如何在子类中使用基类重写ToString()方法?

时间:2014-02-17 17:21:37

标签: c#

基类:

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");

3 个答案:

答案 0 :(得分:5)

该行:

circle.ToString();

只有返回一个字符串,它不会向控制台打印任何内容。你想要:

Console.WriteLine(circle);

注意,WriteLine将隐式调用ToString(),因此没有理由调用它,但如果您愿意,也可以调用它。

答案 1 :(得分:2)

没有任何内容打印到控制台,因为您不打印任何地方。您的覆盖ToString方法根本不会打印到控制台。

Console.WriteLine(circle.ToString());

这就是你所需要的。

答案 2 :(得分:0)

  

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

这是因为ToString方法只返回一个string对象。不执行任何其他操作(通常也不应执行)。要将任何内容打印到控制台,您必须使用Console.WriteConsole.WriteLine。 (两者之间的区别在于最后是否存在换行符。)正如您所说,您有使用Java的经验,这与System.out.printSystem.out.println相同。

  

我曾经学过java,也想知道我是否正确制作了区域方法,例如使用get {}和set {}。

这些不是方法,而是属性。它们与使用名为getXXXXsetXXXX的方法创建Java Bean类相同。您当然可以将代码放入其中(事实上,添加代码是写public string Id { get; set; }以上的唯一原因,因为空的非抽象getter / setter将在编译时自动生成),但它是< em>非常在您使用Area时看到getter修改字段并不常见。从技术上讲,您每次都将area设置为相同的内容,但在实际环境中,我不希望var a = myCircle.Area对{{1}进行任何修改}}

如果他们调用myCirclemyObj.getThunk(),请考虑另一个程序员在Java中会发生什么。在C#getters / setters中实现相同的行为。

  

还说明了toString方法中的一点:

myObj.setThunk(myThunk)

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