继承所需的get或set访问器
本文关键字:set 访问 get 继承 | 更新日期: 2023-09-27 18:15:02
我想看看方法bark是否会被覆盖。
出于某种原因,我得到了一个get或set访问器所需的错误和另一个错误,当我试图用a.bark
从main调用方法bark。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace animals
{
class Animal
{
public void bark {
Console.WriteLine("woohhoo");
}
}
class dog : Animal
{
public void bark
{
Console.WriteLine("woof");
}
}
class Program
{
static void Main(string[] args)
{
Animal a = new Animal();
a.bark;
dog d = new dog();
d.bark;
}
}
}
你的方法声明中缺少圆括号:
这里:看看这个小提琴
你应该用()在c#中声明你的方法,并且在方法名后面使用括号来调用它们:a.bark();
class Animal
{
public void bark() {
Console.WriteLine("woohhoo");
}
}
class dog : Animal
{
public void bark()
{
Console.WriteLine("woof");
}
}
这样写:
public static void Main()
{
Animal a = new Animal();
a.bark();
dog d = new dog();
d.bark();
}
同样,不,该方法不会重写,因为在c#中,如果你想让派生类型重写基类中的方法,你必须在基类中标记该方法为virtual,并在派生类中重写它。
考虑像这样重构代码。注意,现在你可以在Animal变量中创建狗,并且正确调用方法。
Animal d = new dog();
d.bark();
要覆盖你需要一个虚函数。函数也需要括号。如果没有括号它会认为这是一个属性
的基本形式:-
public void talk
{
get { return somevariable; }
set { somevariable = value}
}
这就是为什么它告诉你它想要get或set
还叫它"树皮"是奇怪的动物。所以稍微改变一下,你想要的是:-
class Animal
{
public virtual void talk() {
Console.WriteLine("woohoo");
}
}
class dog : Animal
{
public override void talk()
{
Console.WriteLine("woof");
}
}
class Program
{
static void Main(string[] args)
{
Animal a = new Animal();
a.talk();
dog d = new dog();
d.talk();
// this part is key, when you have a dog as an animal, when you
// call talk it will use the overriden method. If you don't have
// virtual and override, then this would go "woohoo"
Animal da = d;
da.talk();
}
}
正如评论中提到的,你需要在bark后面加上括号。
c#在覆盖方面为您提供了几个选项。给出如下主要方法
static void Main(string[] args)
{
Animal a = new Animal();
a.bark();
dog d = new dog();
d.bark();
}
如果你考虑下面的类(版本A),这种技术被称为隐藏。狗叫的方法隐藏动物的。注意狗叫方法前面的新关键字。
class Animal {
public void bark (){
Console.WriteLine("woohhoo");
}
}
class dog : Animal {
public new void bark() {
Console.WriteLine("woof");
}
}
output
woohhoo
woof
现在考虑以下类(版本B),其中狗的吠叫方法覆盖了动物的吠叫方法。
class Animal {
public virtual void bark (){
Console.WriteLine("woohhoo");
}
}
class dog : Animal {
public override void bark() {
Console.WriteLine("woof");
}
}
输出结果相同。那么区别是什么呢?按如下方式更改main方法,并运行版本A和版本b的代码
static void Main(string[] args)
{
Animal a = new Animal();
a.bark();
Animal d = new dog();
d.bark();
}
Version A output
woohhoo
woohhoo
Version B output
woohhoo
woof