Как мне реализовать интерфейс с устаревшим методом в VB.NET без подавления предупреждений? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть интерфейс I, и я только что решил отказаться от метода OldMethod (потому что он плохо назван, потому что я хочу дополнительные параметры, вы называете его) и советует пользователям моей библиотеки использовать NewMethod вместо,Таким образом, я расширил I следующим образом:

Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod()
    Sub NewMethod()
End Interface

Однако теперь все мои классы , реализующие I, получают предупреждение компилятора:

Class C
    Implements I

    ' The following line yields warning BC40000 
    Public Sub OldMethod() Implements I.OldMethod
        Throw New NotImplementedException()
    End Sub

    Public Sub NewMethod() Implements I.NewMethod
        Throw New NotImplementedException()
    End Sub
End Class

Для меня это не имеет смысла: для реализации I (которая в целом не устарела), мне нужно для реализации OldMethod.Соответствующий код в C # прекрасно компилируется и не выдает предупреждений:

interface I
{
    [Obsolete("Use NewMethod instead.")]
    void OldMethod();
    void NewMethod();
}

class Explicit : I
{
    public void NewMethod() { throw new NotImplementedException(); }
    public void OldMethod() { throw new NotImplementedException(); }
}

class Implicit : I
{
    void I.NewMethod() { throw new NotImplementedException(); }
    void I.OldMethod() { throw new NotImplementedException(); }
}

Я знаю, что мог бы просто подавить предупреждение в VB , но, как правило, предупреждение компилятора указывает, чтовы делаете что-то, что не должно быть сделано таким образом.

Как реализовать интерфейс с устаревшим элементом в VB.NET без получения устаревшего предупреждения?

1 Ответ

0 голосов
/ 12 октября 2018

Изложение этого ответа из моего комментария.

Реализующий класс должен реализовать член Obsolete для выполнения контракта, но когда метод интерфейса помечен как Obsolete, вы должен также пометить соответствующий метод как Obsolete, чтобы компилятор не использовал реализацию члена Obsolete.

Public Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod() 
    Sub NewMethod()
End Interface

Public Class C
    Implements I

    <Obsolete("Use NewMethod instead.")>
    Public Sub OldMethod() Implements I.OldMethod ' No warning
        Throw New NotImplementedException()
    End Sub

    Public Sub NewMethod() Implements I.NewMethod
        Throw New NotImplementedException()
    End Sub
End Class

Хотя это не совсем относится к этомуконкретный вопрос, во время исследования я обнаружил этот пост в блоге Гранта Уинни , объясняющий, почему стоит пометить устаревшие элементы на самом элементе интерфейса (а также на элементе реализации)

...