Tôi muốn biết sự khác biệt giữa các đối tượng this
và base
trong C#
. Thực hành tốt nhất khi sử dụng chúng là gì?Sự khác biệt giữa điều này và cơ sở
Trả lời
this
đại diện cho cá thể lớp hiện tại trong khi base
cấp độ gốc. Ví dụ về cách sử dụng:
public class Parent
{
public virtual void Foo()
{
}
}
public class Child : Parent
{
// call constructor in the current type
public Child() : this("abc")
{
}
public Child(string id)
{
}
public override void Foo()
{
// call parent method
base.Foo();
}
}
this
là bất kỳ đối tượng nào hiện đang được sử dụng. Base
đề cập đến một lớp cơ sở nói chung.
Nếu đối tượng là base
thì trong trường hợp đó this
cũng có thể tham chiếu đến đối tượng base
.
this
là phiên bản lớp hiện tại.
base
đề cập đến lớp cơ sở của cá thể hiện tại, tức là lớp mà nó bắt nguồn. Nếu lớp hiện tại không được bắt nguồn từ bất cứ điều gì base
sẽ tham chiếu đến lớp System.Object
(tôi nghĩ).
Hai từ khóa rất khác nhau.
this
đề cập đến dụ hiện (không phải là “lớp học hiện tại”). Nó chỉ có thể được sử dụng trong các phương thức không tĩnh (vì trong một phương thức tĩnh không có cá thể hiện tại). Gọi một phương thức trênthis
sẽ gọi phương thức theo cách tương tự như khi bạn gọi nó trên một biến chứa cùng một cá thể.base
là từ khóa cho phép cuộc gọi phương thức được kế thừa, tức là nó gọi phương thức được chỉ định từ loại cơ sở. Nó cũng chỉ có thể được sử dụng trong một phương thức không tĩnh. Nó thường được sử dụng trong một phương thức ghi đè ảo, nhưng thực sự có thể được sử dụng để gọi bất kỳ phương thức nào trong kiểu cơ sở. Nó rất khác với lời gọi phương thức bình thường bởi vì nó phá vỡ công văn phương thức ảo bình thường: nó gọi phương thức cơ sở trực tiếp ngay cả khi nó là ảo.
Darin là đúng. Một ví dụ cũng có thể hữu ích. (Không có ví dụ nào khi tôi đăng lần đầu. Hiện có.)
class Base {
protected virtual void SayHi() {
Console.WriteLine("Base says hi!");
}
}
class Derived : Base {
protected override void SayHi() {
Console.WriteLine("Derived says hi!");
}
public void DoIt() {
base.SayHi();
this.SayHi();
}
}
Bản in trên "Base nói hi!" tiếp theo là "Derived nói hi!"
phép nói rằng bạn có mã như thế này
class B extends A {
public B() {
// this will refer to the current object of class B
// base will refer to class A
}
}
Lưu ý: Cú pháp của mã là trong java nhưng nó là tự giải thích.
cơ sở - được sử dụng để truy cập vào các thành viên của lớp cơ sở từ bên trong một lớp học có nguồn gốc
này - đề cập đến các trường hợp hiện tại của lớp và được thừa hưởng
class BaseClass
{
public string BaseAttr { get; set; }
}
class A : BaseClass
{
public string Attr { get; set; }
public void Method()
{
this.Attr = "ok";
this.BaseAttr = "base ok";
base.BaseAttr = "ok";
base.Attr = "unavailable"; //!
}
}
"this
" điểm từ khóa vào địa chỉ của đối tượng hiện tại.chúng tôi có thể sử dụng từ khóa "this
" để thể hiện đối tượng hiện tại (của lớp hiện tại).
Trường hợp là "base
" từ khóa đại diện cho "Lớp cha"
Vì vậy, nếu bạn muốn sử dụng/chức năng gọi của lớp cha, bạn có thể sử dụng "base
" Từ khóa.
base
rất hữu ích trong chức năng ghi đè chức năng gọi của lớp cha.
nói đúng điều này đề cập đến cá thể lớp hiện tại, không phải loại lớp hiện tại. –
@Adrian, có điểm tốt. Đã cập nhật bài đăng của tôi để tính đến. –