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()
)