C#方法隐藏和重写有何区别
就是派生类用override对基类虚方法重写和重新new一个同名方法隐藏基类方法有何区别啊???...
就是派生类用override对基类虚方法重写和重新new一个同名方法隐藏基类方法有何区别啊???
展开
展开全部
"C#方法隐藏和重写有何区别"
C#允许派生类中的方法与基类中的方法具有相同的名称 ;
在基类中引入与派生类中的某个成员具有相同名称的新成员在C#中是完全支持的;
这时你必须明确告诉编译器,你希望的操作是怎么样的!
//
//new 隐藏方法情况
//
class MyClass
{
public void Get()
{
Console.WriteLine("He is Father");
}
}
class YourClass :MyClass
{
public new void Get() //定义了一个与父类同的名方法 而不是实现父类Get()
{
Console.WriteLine("He is Son");
}
}
class Program
{
static void Main()
{
YourClass y=new YourClass();
y.Get()//He is Son
MyClass m=y;
m.Get();//He is Father
}
}
在派生类中,不加new 程序也会成功编译运行,只不过编译器会发出警告,没有关系不用理它,因为当在派生类上 定义有与基类同名的方法时,编译器的默认行为就是隐藏基类的同名成员!
//
//Virtual 虚方法 重写实现
//
class MyClass
{
public virtual void Get()
{
Console.WriteLine("He is Father");
}
}
class YourClass :MyClass
{
public override void Get() //子类重新实现Get()方法,但此方法的定义是在父类中
{ //如果父类此方法不是被虚virtual的或抽象的abstract,
Console.WriteLine("He is Son");//不能使用override关键进行重写
}
//public new virtual void Get(){} 隐藏
//public new void Get(){}
}
class Program
{
static void Main()
{
YourClass y=new YourClass();
y.Get()//He is Son
MyClass m=y;
m.Get();//He is Son //输出:相比隐藏情况,调用的是子类的新实现
}
}
面象对象编程的重要特性之一,就是继承与多态,C#中的每一种类型都是多态的,而每一种类型的成员组成, 都是拥有(继承)父类上定义的成员与自身定义的成员,如果父类上的成员实现,并不适合自己的需要,子类就有 可能重写(替换实现)父类成员,实现自己的需求!C#语法要求父类成员必须虚的或抽象的,子类才可以重写(替换实现). 如果你不是在子类中重写而是在自身类型上定义了一个与父类同名的方法,此时,就需要new关键来隐藏基类的同名
成员,告诉编译器,这是你所希望的操作!当然,大多数的情况下,我们都是对基类成员进行重写,而不是进行隐藏操作!
成员有virtual修饰,又会有new(隐藏)修饰的存在,是应对程序的变化!以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容.
如果还有疑问,可以给我发消息!
C#允许派生类中的方法与基类中的方法具有相同的名称 ;
在基类中引入与派生类中的某个成员具有相同名称的新成员在C#中是完全支持的;
这时你必须明确告诉编译器,你希望的操作是怎么样的!
//
//new 隐藏方法情况
//
class MyClass
{
public void Get()
{
Console.WriteLine("He is Father");
}
}
class YourClass :MyClass
{
public new void Get() //定义了一个与父类同的名方法 而不是实现父类Get()
{
Console.WriteLine("He is Son");
}
}
class Program
{
static void Main()
{
YourClass y=new YourClass();
y.Get()//He is Son
MyClass m=y;
m.Get();//He is Father
}
}
在派生类中,不加new 程序也会成功编译运行,只不过编译器会发出警告,没有关系不用理它,因为当在派生类上 定义有与基类同名的方法时,编译器的默认行为就是隐藏基类的同名成员!
//
//Virtual 虚方法 重写实现
//
class MyClass
{
public virtual void Get()
{
Console.WriteLine("He is Father");
}
}
class YourClass :MyClass
{
public override void Get() //子类重新实现Get()方法,但此方法的定义是在父类中
{ //如果父类此方法不是被虚virtual的或抽象的abstract,
Console.WriteLine("He is Son");//不能使用override关键进行重写
}
//public new virtual void Get(){} 隐藏
//public new void Get(){}
}
class Program
{
static void Main()
{
YourClass y=new YourClass();
y.Get()//He is Son
MyClass m=y;
m.Get();//He is Son //输出:相比隐藏情况,调用的是子类的新实现
}
}
面象对象编程的重要特性之一,就是继承与多态,C#中的每一种类型都是多态的,而每一种类型的成员组成, 都是拥有(继承)父类上定义的成员与自身定义的成员,如果父类上的成员实现,并不适合自己的需要,子类就有 可能重写(替换实现)父类成员,实现自己的需求!C#语法要求父类成员必须虚的或抽象的,子类才可以重写(替换实现). 如果你不是在子类中重写而是在自身类型上定义了一个与父类同名的方法,此时,就需要new关键来隐藏基类的同名
成员,告诉编译器,这是你所希望的操作!当然,大多数的情况下,我们都是对基类成员进行重写,而不是进行隐藏操作!
成员有virtual修饰,又会有new(隐藏)修饰的存在,是应对程序的变化!以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容.
如果还有疑问,可以给我发消息!
展开全部
override是覆盖原方法,原来的都没了,而用new相当于原来得还在,但是都隐藏起来看不到了,使用new是因为定义的时候没有定义虚方法,无法重写,所以只能隐藏起来
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
override 用了就只有一个方法this.Fun();
重新new一个同名方法 还是有两个方法可以用;一个是Base.Fun();一个是this.Fun();
重新new一个同名方法 还是有两个方法可以用;一个是Base.Fun();一个是this.Fun();
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
override是覆盖原方法,也就是说,派生类中只有一个方法fun(),此时基类中也只有一个方法fun(),两个方法的实现应该有所不同。如果是new的话,派生类中有两个方法,隐藏了基类的那个方法,同时还有另外的新new的方法。也就是说,当调用派生类的新new的方法时,指针是指向新new的这个方法,而非基类的方法。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
区别在于当父类调用这个函数的时候使用哪个方法。
比方说父类SuperClass被SubClass1,SubClass2所继承,方法Method1在SubClass1里被override, 在SubClass2里被new。
那么
SubClass1 CA = new SubClass1();
SubClass2 CB = new SubClass2();
((SuperClass)CA).Method1()调用的是被SubClass1 override后的Method1
((SuperClass)CB).Method1()调用的是SuperClass自身的Method1
比方说父类SuperClass被SubClass1,SubClass2所继承,方法Method1在SubClass1里被override, 在SubClass2里被new。
那么
SubClass1 CA = new SubClass1();
SubClass2 CB = new SubClass2();
((SuperClass)CA).Method1()调用的是被SubClass1 override后的Method1
((SuperClass)CB).Method1()调用的是SuperClass自身的Method1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询