c # виртуальные методы в классе, который реализует интерфейс - PullRequest
3 голосов
/ 05 декабря 2011

Допустим, у меня есть следующий класс:

namespace myNamespace
{
    [TypeLibType((short)2)]
    [ClassInterface((short)0)]
    [ComImport]
    public class myClass : myInterface
    {
        public virtual void myMethod();
    }
}

и скажем, у меня есть следующий интерфейс, который реализует этот класс

namespace myNamespace
{
    [Guid("2105896C-2B38-4031-BD0B-7A9C4A39FB93")]
    [TypeLibType((short)4160)]
    [ComImport]
    public interface myInterface
    {
        void myMethod();
    }
}

Теперь, когда я компилирую это, виртуальный метод в первом классе возвращается со следующей ошибкой:

'myNamespace.myClass.myMethod()' must declare a body because it is not marked abstract, extern, or partial

Этот метод должен прекрасно компилироваться, потому что он помечен как виртуальный, но по какой-то причине он все равно не будет компилироваться, и я в некотором затруднении: почему, если я альтернативно определю тело в MyMethod в MyClass, тогда я вместо этого получите следующую ошибку:

Since 'myClass.myMethod' has the ComImport attribute, 'myNamespace.myClass.myMethod' must be extern or abstract

Я использую .Net 3.5 для этой настройки, но он все еще не работает в .Net 4.0 либо

1 Ответ

7 голосов
/ 05 декабря 2011

Я думаю, вы путаете virtual с abstract.Виртуальные методы требуют реализации, но может быть переопределено.

С другой стороны, абстрактные методы могут быть объявлены так, как у вас есть, без реализации.Подклассы несут ответственность за обеспечение реализации, и если они этого не делают, они встречаются с ошибкой компилятора.

...