Cách triển khai thuộc tính trong giao diện


134

Tôi có giao diện IResourcePolicychứa tài sản Version. Tôi phải triển khai thuộc tính này chứa giá trị, mã được viết trong các trang khác:

IResourcePolicy irp(instantiated interface)
irp.WrmVersion = "10.4";

Làm thế nào tôi có thể thực hiện tài sản version?

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}

1
Tại sao bạn muốn thực hiện bất cứ điều gì trong giao diện? Ở đó bạn chỉ cần xác định giao diện ...
Stefan Steinegger

Câu trả lời:


295

Trong giao diện, bạn chỉ định thuộc tính:

public interface IResourcePolicy
{
   string Version { get; set; }
}

Trong lớp triển khai, bạn cần thực hiện nó:

public class ResourcePolicy : IResourcePolicy
{
   public string Version { get; set; }
}

Điều này có vẻ tương tự, nhưng nó là một cái gì đó hoàn toàn khác nhau. Trong giao diện, không có mã. Bạn chỉ cần xác định rằng có một thuộc tính với getter và setter, bất cứ điều gì họ sẽ làm.

Trong lớp, bạn thực sự thực hiện chúng. Cách ngắn nhất để làm điều này là sử dụng { get; set; }cú pháp này . Trình biên dịch sẽ tạo một trường và tạo triển khai getter và setter cho nó.


Làm thế nào để bạn nói rằng đó Versionlà công khai trong lớp? À, tôi thấy vấn đề của tôi: nếu bạn triển khai Giao diện một cách rõ ràng (ví dụ: IResourcePolicy.Versionbạn không thể xác định nếu nó công khai.
PeterX

5
Bạn nói đúng, nó nên được công khai. Tôi sửa nó rồi. Tôi không quan tâm lắm về điều này, vì nó không liên quan đến những điều tôi cố gắng giải thích.
Stefan Steinegger

7
Tất nhiên là có liên quan! Nếu bạn muốn cung cấp một câu trả lời tốt, bạn cần làm cho nó đơn giản cho mọi người. Vì vậy, họ không vấp ngã trong vấn đề tiếp theo.
Bitterblue

21

Ý bạn là như thế này?

class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}

1
điều này tôi biết ,, nhưng tôi đã gán các giá trị sao cho irp.WrmVersion = "10,4"; xem câu hỏi của tôi ,, tôi không cần phải mất giá trị đó ,, tôi phải vượt qua nó
peter

16

Các giao diện không thể chứa bất kỳ triển khai nào (bao gồm các giá trị mặc định). Bạn cần chuyển sang lớp trừu tượng.


Đó là những gì tôi có thể thực hiện tài sản này ở một nơi khác
peter

tạo một lớp @petr thực hiện giao diện đó, hơn là tạo cá thể cho lớp đó và gán cho biến có loại giao diện
Arsen Mkrtchyan

4
Tôi sẽ bỏ phiếu cho câu đầu tiên. Nhưng các lớp cơ sở trừu tượng nên luôn luôn tránh nếu một giao diện là đủ. Vì vậy, trước khi bạn biết vấn đề nào thực sự cần giải quyết, bạn không nên đề xuất tạo một lớp cơ sở.
Stefan Steinegger

2
@Stefan, bởi câu thứ hai tôi có nghĩa là nếu anh ta thực sự cần một giá trị mặc định được giới thiệu, thì anh ta nên sử dụng lớp trừu tượng.
Vitaliy Liptchinsky

1

Ví dụ đơn giản về việc sử dụng một thuộc tính trong giao diện:

using System;
interface IName
{
    string Name { get; set; }
}

class Employee : IName
{
    public string Name { get; set; }
}

class Company : IName
{
    private string _company { get; set; }
    public string Name
    {
        get
        {
            return _company;
        }
        set
        {
            _company = value;
        }   
    }
}

class Client
{
    static void Main(string[] args)
    {
        IName e = new Employee();
        e.Name = "Tim Bridges";

        IName c = new Company();
        c.Name = "Inforsoft";

        Console.WriteLine("{0} from {1}.", e.Name, c.Name);
        Console.ReadKey();
    }
}
/*output:
 Tim Bridges from Inforsoft.
 */

0
  • nhưng tôi đã gán các giá trị sao cho irp.WrmVersion = "10,4";

Câu trả lời của J.Random Coder và khởi tạo trường phiên bản.


private string version = "10.4';

0

Bạn nên sử dụng lớp trừu tượng để khởi tạo một thuộc tính. Bạn không thể bắt đầu trong Inteface.

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.