基类:
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 :(得分:5)
该行:
circle.ToString();
只有返回一个字符串,它不会向控制台打印任何内容。你想要:
Console.WriteLine(circle);
注意,WriteLine
将隐式调用ToString()
,因此没有理由调用它,但如果您愿意,也可以调用它。
答案 1 :(得分:2)
没有任何内容打印到控制台,因为您不打印任何地方。您的覆盖ToString
方法根本不会打印到控制台。
Console.WriteLine(circle.ToString());
这就是你所需要的。
答案 2 :(得分:0)
当我调用toString方法时,没有任何内容打印到控制台。
这是因为ToString
方法只返回一个string
对象。不执行任何其他操作(通常也不应执行)。要将任何内容打印到控制台,您必须使用Console.Write
或Console.WriteLine
。 (两者之间的区别在于最后是否存在换行符。)正如您所说,您有使用Java的经验,这与System.out.print
和System.out.println
相同。
我曾经学过java,也想知道我是否正确制作了区域方法,例如使用get {}和set {}。
这些不是方法,而是属性。它们与使用名为getXXXX
和setXXXX
的方法创建Java Bean类相同。您当然可以将代码放入其中(事实上,添加代码是写public string Id { get; set; }
以上的唯一原因,因为空的非抽象getter / setter将在编译时自动生成),但它是< em>非常在您使用Area
时看到getter修改字段并不常见。从技术上讲,您每次都将area
设置为相同的内容,但在实际环境中,我不希望var a = myCircle.Area
对{{1}进行任何修改}}
如果他们调用myCircle
或myObj.getThunk()
,请考虑另一个程序员在Java中会发生什么。在C#getters / setters中实现相同的行为。
还说明了toString方法中的一点:
myObj.setThunk(myThunk)
如上所述,Console.WriteLine("bla bla bla");
返回ToString
值。您可以将其存储在变量中,将其传递给其他方法等。string
将输入字符串打印到控制台,并且不返回任何内容。如果WriteLine
被赋予非WriteLine
值,则会尝试自动为该值调用string
。