当我在 C# 中继承一个方法并调用继承的方法时。我需要使用 base 还是这个
When I inherit a method in C# and call the inherited method. Do I need to use base or this
当我们在C#中继承一个方法时,如何才是调用它的最佳方式。与基地或这个。这里有一些例子:
class User
{
public void LogData()
{
Console.WriteLine($"Log data from user");
}
}
class Admin : User
{
public void DeleteData()
{
// How is it right way to call that method?
// base.LogData();
// or
// this.LogData();
Console.WriteLine("Deleting");
}
}
这是如何从 child class
调用 Base 方法的示例
class a
{
public void callMe()
{
// Base logic
}
}
class b : a
{
public new void callMe()
{
// This Will call Base method
base.callMe();
// Derived Logic
}
}
现在请注意 "new" 关键字的使用,它基本上隐藏了基本方法 这就是你 Overrride 的方式方法。
您只会真正使用基本前缀来绕过 class 上下文执行当前所在的本地定义的同名方法。
this.LogData() 的行为与上面示例中的 LogData() 相同。
base.LogData() 将调用基 class 上定义的 LogData,但重要的是要注意,在该执行上下文中,LogData 将看到 'this' class 作为 'User' 类型 class,而不是 'Admin' class。
这是因为继承模型。
每个 'Admin' 可能是一个 'User',但并非所有 'Users' 都是 'Admins'。
如果您的执行设法进入基础 class,LogData 方法将只能访问用户 class 上的成员 - 因为在那个时间点,Admin 用户已经在方法执行期间隐式转换回 'User' class。
如上所述 - 有 'new' 关键字 - 您可以使用它来禁用与 'hiding' 方法相关的警告。
应该注意的是,我认为 'new' 关键字仅作为禁用警告的一种方式,实际上并不能促进方法的覆盖。
如果您希望在派生的 classes 中重写和创建同名方法,您应该在适当的地方使用 virtual 和重写。
有关它们的更多信息,请参见上面的 link。
bc.Method1();
bc.Method2();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();
public override void Method1()
{
Console.WriteLine("Derived - Method1");
}
public virtual void Method1()
{
Console.WriteLine("Base - Method1");
}
// Output:
// Base - Method1
// Base - Method2
// Derived - Method1
// Derived - Method2
// Derived - Method1
// Base - Method2
当我们在C#中继承一个方法时,如何才是调用它的最佳方式。与基地或这个。这里有一些例子:
class User
{
public void LogData()
{
Console.WriteLine($"Log data from user");
}
}
class Admin : User
{
public void DeleteData()
{
// How is it right way to call that method?
// base.LogData();
// or
// this.LogData();
Console.WriteLine("Deleting");
}
}
这是如何从 child class
调用 Base 方法的示例class a
{
public void callMe()
{
// Base logic
}
}
class b : a
{
public new void callMe()
{
// This Will call Base method
base.callMe();
// Derived Logic
}
}
现在请注意 "new" 关键字的使用,它基本上隐藏了基本方法 这就是你 Overrride 的方式方法。
您只会真正使用基本前缀来绕过 class 上下文执行当前所在的本地定义的同名方法。
this.LogData() 的行为与上面示例中的 LogData() 相同。
base.LogData() 将调用基 class 上定义的 LogData,但重要的是要注意,在该执行上下文中,LogData 将看到 'this' class 作为 'User' 类型 class,而不是 'Admin' class。 这是因为继承模型。 每个 'Admin' 可能是一个 'User',但并非所有 'Users' 都是 'Admins'。
如果您的执行设法进入基础 class,LogData 方法将只能访问用户 class 上的成员 - 因为在那个时间点,Admin 用户已经在方法执行期间隐式转换回 'User' class。
如上所述 - 有 'new' 关键字 - 您可以使用它来禁用与 'hiding' 方法相关的警告。 应该注意的是,我认为 'new' 关键字仅作为禁用警告的一种方式,实际上并不能促进方法的覆盖。
如果您希望在派生的 classes 中重写和创建同名方法,您应该在适当的地方使用 virtual 和重写。 有关它们的更多信息,请参见上面的 link。
bc.Method1();
bc.Method2();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();
public override void Method1()
{
Console.WriteLine("Derived - Method1");
}
public virtual void Method1()
{
Console.WriteLine("Base - Method1");
}
// Output:
// Base - Method1
// Base - Method2
// Derived - Method1
// Derived - Method2
// Derived - Method1
// Base - Method2