如何为接口实现默认方法?

5
在.Net中创建新类时,如果我声明它为“实现IDisposable”,然后按回车键,我会发现Visual Studio自动为我的类添加了许多已经填充好的方法和函数。但是当我尝试在接口中这样做时,它会创建空的方法和函数。

有没有办法提供默认实现我的方法和函数?

我一直在寻找链接,但它并没有解决我的问题。

我想要的实现示例:

#Region "IDisposable Support"
    Private disposedValue As Boolean ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: dispose managed state (managed objects).
            End If

            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
            ' TODO: set large fields to null.
        End If
        Me.disposedValue = True
    End Sub

    ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
    'Protected Overrides Sub Finalize()
    '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

提前感谢!

具体需求说明:

假设有以下接口:

enter image description here

下面是操作和我所需要的内容:

enter image description here


一个接口不能实现函数。它只定义了一些函数,实现该接口的类将必须实现这些函数。 也许您想查看抽象类。http://msdn.microsoft.com/en-us/library/k535acbf%28v=vs.71%29.aspx - blfuentes
1
谢谢你的回答。但是 .Net 接口是如何工作的?当我尝试实现其中一个接口时,它们为什么会自动添加所有这些代码到我的类中呢?这就是我正在寻找的功能。 - Thomas Carlton
2
你的问题不是很清楚。 - rory.ap
它知道如何设置基本的IDisposable实现,因为有一个常见的模式你应该遵循。但是它怎么可能知道如何实现你的接口呢? - weston
这正是我正在寻找的,获奖者! - Thomas Carlton
显示剩余4条评论
3个回答

0

这个问题很旧了,但其他有同样问题的人可能会来到这里。

上面的答案已经过时了。

从C# 8开始,你可以使用默认接口方法

文档中的在C#中使用默认接口方法安全地更新接口文章非常好地解释了这些内容。

以下是从文档中摘录的一个例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace customer_relationship
{
    public interface ICustomer
    {
        IEnumerable<IOrder> PreviousOrders { get; }

        DateTime DateJoined { get; }
        DateTime? LastOrder { get; }
        string Name { get; }
        IDictionary<DateTime, string> Reminders { get; }

        public static void SetLoyaltyThresholds(TimeSpan ago, int minimumOrders, decimal percentageDiscount) // See how a method has a default implementation.
        {
            length = ago;
            orderCount = minimumOrders;
            discountPercent = percentageDiscount;
        }
        private static TimeSpan length = new TimeSpan(365 * 2, 0, 0, 0); // two years
        private static int orderCount = 10;
        private static decimal discountPercent = 0.10m;

        public decimal ComputeLoyaltyDiscount() => DefaultLoyaltyDiscount(this);
        protected static decimal DefaultLoyaltyDiscount(ICustomer c)
        {
            DateTime start = DateTime.Now - length;

            if ((c.DateJoined < start) && (c.PreviousOrders.Count() > orderCount))
            {
                return discountPercent;
            }
            return 0;
        }
    }
}

0

它知道如何设置基本的IDisposable实现,因为有一个常见的模式你应该遵循。

但是它怎么可能知道如何实现你的接口呢?所以你会得到一些空方法,需要自己填写。

你最好的选择是设置一个片段,而不是让Visual Studio添加未实现的成员。


让我们简单点。当您实现IDisposable接口时,不仅会添加空方法,还会添加它们的代码,这些代码肯定是从某个地方带来的...看看我在第一篇帖子中展示的例子。问题是如何使用自己的接口做同样的事情...假设我有一个代码,应该是接口方法的默认实现,当我在类中实现接口时,代码会自动添加... - Thomas Carlton
我增加了另一个想法。 - weston
感谢您的提议。您知道如何将接口与代码片段“链接”起来,以便用户在尝试实现接口时自动插入代码片段吗? - Thomas Carlton
我不知道任何方法,不行。 - weston

0
我能想到的最接近的方法是创建自己的项目模板,用户可以从Visual Studio“添加新项”对话框中选择。您可以修改重构模板,但这将修改所有接口实现。 有关创建项目模板的讨论,请参见此处: http://msdn.microsoft.com/en-us/library/tsyyf0yh.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接