想知道以下几点之间的区别:
案例1:基类
public void DoIt();
Run Code Online (Sandbox Code Playgroud)
案例1:继承的类
public new void DoIt();
Run Code Online (Sandbox Code Playgroud)
案例2:基类
public virtual void DoIt();
Run Code Online (Sandbox Code Playgroud)
案例2:继承的类
public override void DoIt();
Run Code Online (Sandbox Code Playgroud)
根据我运行的测试,情况1和2似乎具有相同的效果.有区别,还是首选方式?
考虑以下代码:
class Program
{
static void Main(string[] args)
{
Person person = new Teacher();
person.ShowInfo();
Console.ReadLine();
}
}
public class Person
{
public void ShowInfo()
{
Console.WriteLine("I am Person");
}
}
public class Teacher : Person
{
public new void ShowInfo()
{
Console.WriteLine("I am Teacher");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,输出以下内容:
我是人
但是,你可以看到它是一个实例Teacher,而不是Person.代码为什么这样做?
任何人都可以在内存和引用方面告诉覆盖和隐藏的工作.
class A
{
public virtual void Test1() { //Impl 1}
public virtual void Test2() { //Impl 2}
}
class B : A
{
public override void Test1() { //Impl 3}
public new void Test2() { Impl 4}
}
static Main()
{
A aa=new B() //This will give memory to B
aa.Test1(); //What happens in terms of memory when this executes
aa.Test2(); //-----------------------SAME------------------------
}
Run Code Online (Sandbox Code Playgroud)
这里的内存是B类,但在第二个语句中,将调用aa.Test2类A的方法.为什么?如果B有内存,则应调用B的方法(在我看来).
任何非常深刻和完全描述这一基础的链接/练习将是一个很大的帮助.
可能重复:
C#关键字使用情况虚拟+覆盖与新增
新和重写之间的差异?
所以我一直在研究一个项目,并决定阅读C#中关键字new和override关键字之间的区别.
从我看到的情况来看,似乎使用new关键字功能是在代码中创建错误的好方法.除此之外,我真的不知道何时使用它真的有意义.
更多出于好奇心,有什么模式可以让new关键字成为正确的方法吗?
我读到newmodifer隐藏了基类方法.
using System;
class A
{
public void Y()
{
Console.WriteLine("A.Y");
}
}
class B : A
{
public new void Y()
{
// This method HIDES A.Y.
// It is only called through the B type reference.
Console.WriteLine("B.Y");
}
}
class Program
{
static void Main()
{
A ref1 = new A(); // Different new
A ref2 = new B(); // Polymorpishm
B ref3 = new B();
ref1.Y();
ref2.Y(); //Produces A.Y line #xx
ref3.Y();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么 …
我无法理解"受保护"的需要或目的,当我有"虚拟/覆盖"时,有人可以解释我,如果它们几乎相同,我需要这两件事.
编辑:
感谢所有帮助者,我现在明白"受保护"仅用于可见性目的,而虚拟/覆盖用于类行为.
以前我问过一个问题没有得到充分回答,因此我决定重新制定我的问题以了解发生了什么:
这是我的类层次结构:
interface I
{
void f();
}
class A : I
{
// non virtual method
public void f()
{
Debug.Log("---->> A ");
}
}
class B : A
{
// non overriding but hiding class A method
public void f()
{
Debug.Log("---->> B ");
}
}
class C : I
{
// non virtual method
public void f()
{
Debug.Log("---->> C ");
}
}
Run Code Online (Sandbox Code Playgroud)
这是执行代码:
Random rnd = new Random();
var randomI = rnd.Next(0, 2);
I i = …Run Code Online (Sandbox Code Playgroud) 控制器类型上当前的操作请求'索引'在ContactController以下操作方法之间是不明确的:
System.Web.Mvc.ActionResult Index() on type RX.Web.Controllers.ContactController
System.Web.Mvc.ActionResult Index() on type RX.Web.Controllers.CustomControllerBase2[[RX.Core.Model.Contact, RXTechJob.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Run Code Online (Sandbox Code Playgroud)
联系控制器:
public virtual new ActionResult Index()
{
return base.Index();
}
Run Code Online (Sandbox Code Playgroud)
基础控制器:
public virtual ActionResult Index()
{
return View("Index", SelectAll());
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?怎么解决?谢谢!
我有一个基类,我想为所有继承类的方法提供一些"基础"功能.
在我想继承的继承类中:
public override void Setup()
{
base.Setup();
}
Run Code Online (Sandbox Code Playgroud)
但目前它说我必须使用new关键字.
我怎么拥有它所以我必须使用override关键字?
目前我使用new关键字和使用它之间有什么区别override吗?
我实际上写了这个方法:
public static new iTextSharp.text.Color ITextFocusColor()
{
return new iTextSharp.text.Color(234, 184, 24);
}
Run Code Online (Sandbox Code Playgroud)
它是可疑的,但我很惊讶,它允许在方法的返回类型中使用new关键字.如果我把新的或没有新的,是否有任何影响/差异?或者新用的是什么?
在其他面向对象语言中这也是可能的吗?
c# ×10
overriding ×4
new-operator ×3
oop ×3
.net ×1
asp.net-mvc ×1
class ×1
inheritance ×1
interface ×1
polymorphism ×1
syntax ×1