Cảnh báo "Sử dụng từ khóa mới nếu có ý định ẩn"


101

Tôi có cảnh báo ở cuối màn hình:

Cảnh báo 1 'WindowsFormsApplication2.EventControlDataSet.Events' ẩn thành viên kế thừa 'System.ComponentModel.MarshalByValueComponent.Events'. Sử dụng từ khóa mới nếu có ý định ẩn. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Nếu tôi nhấp đúp vào nó, nó sẽ xuất hiện:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Bất cứ ai có thể cho tôi biết làm thế nào để thoát khỏi điều này?

Câu trả lời:


144

Lớp của bạn có một lớp cơ sở và lớp cơ sở này cũng có một thuộc tính (không phải là ảo hoặc trừu tượng) được gọi là Sự kiện đang bị lớp của bạn ghi đè. Nếu bạn định ghi đè nó, hãy đặt từ khóa "mới" sau công cụ sửa đổi. VÍ DỤ

public new EventsDataTable Events
{
  ..
}

Nếu bạn không muốn ghi đè nó, hãy thay đổi tên thuộc tính của bạn thành tên khác.


23
Đây là một liên kết cho những ai muốn biết sự khác biệt giữa tính năng mới và ghi đè là gì.
starsplusplus

Các new từ khóa sẽ thoát khỏi những lỗi biên dịch, nhưng có thể giới thiệu hành vi không mong đợi khác. Tôi nghĩ bạn nên thêm một cảnh báo vào câu trả lời của mình. Điều đó sẽ hữu ích để hiểu hậu quả của việc thêm new.
ahong

13

@wdavo là chính xác. Điều này cũng đúng đối với các hàm.

Nếu bạn ghi đè một hàm cơ sở, chẳng hạn như Cập nhật, thì trong lớp con của bạn, bạn cần:

new void Update()
{
  //do stufff
}

Nếu không có cái mới khi bắt đầu suy giảm chức năng, bạn sẽ nhận được cờ cảnh báo.


6

Trong đoạn mã dưới đây, Class Athực hiện giao diện IShowvà thực hiện phương thức của nó ShowData. Class Bkế thừa Class A. Để sử dụng ShowDataphương thức trong Class B, chúng ta phải sử dụng từ khóa newtrong ShowDataphương thức để ẩn Class Aphương thức lớp cơ sở và sử dụng overridetừ khóa để mở rộng phương thức.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}

3
Không có overridetrong ví dụ của bạn từ sự giải thích của bạn và overridekhông cần thiết.
Etienne Faucher

Tôi nghĩ rằng ví dụ của bạn đang đi đúng hướng, nhưng chưa đầy đủ. Ngoài ra lời giải thích của bạn không rõ ràng. Bạn có thể chỉnh sửa câu trả lời của mình thành một cái gì đó giống dotnetfiddle.net/Iw0OzB hơn không? Nếu không, tôi có thể sẽ đăng câu trả lời
khó hiểu

0

Hàm mẹ cần virtualtừ khóa và hàm con cần overridetừ khóa ở phía trước định nghĩa hàm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.