Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在子类中使用基类重写的ToString()方法?_C# - Fatal编程技术网

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

C# 如何在子类中使用基类重写的ToString()方法?,c#,C#,基类: namespace inheritance { public abstract class Shape { private string shapeId; private float length; public Shape(string s) { shapeId = s; } public string Id {

基类:

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");
该行:

circle.ToString();
只返回一个字符串,不向控制台打印任何内容。你想要:

Console.WriteLine(circle);

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

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

Console.WriteLine(circle.ToString());
这就是你需要的

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

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

我曾经学习过java,还想知道我是否正确地创建了area方法,例如使用get{}和set{}

这些不是方法,而是属性。它们与使用名为
getXXXX
setXXXX
的方法创建JavaBean类相同。您当然可以将代码放入其中(事实上,添加代码是编写更多内容的唯一原因,例如
公共字符串Id{get;set;}
,因为空的非抽象getter/setter将在编译时自动生成),但很少看到getter像您使用
区域那样修改字段。从技术上讲,您每次都将
area
设置为相同的内容,但在现实世界中,我不希望
var a=myCircle.area
myCircle
进行任何修改

考虑一下,如果其他程序员调用
myObj.getThunk()
myObj.setThunk(myThunk)
,Java中会发生什么。在C#getter/setter中实现相同的行为

toString方法的另一个要点是:

Console.WriteLine("bla bla bla");

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

您的意思是
Console.WriteLine(circle.ToString())
(顺便说一下,甚至不需要
ToString()