Наследование C # - PullRequest
       30

Наследование C #

5 голосов
/ 23 июня 2009

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

interface ISomeInterface
{
    void DoSomething();
    void A();
    void B();    
}

public abstract class ASomeAbstractImpl : ISomeInterface
{
    public abstract void A();
    public abstract void B();
    public void DoSomething()
    {
        // code here
    }
}

public class SomeImpl : ASomeAbstractImpl 
{
    public override void A()
    {
        // code
    }

    public override void B()
    {
        // code
    }
}

Проблема в том, что я хочу, чтобы метод ASomeAbstractImpl.DoSomething() был запечатан (окончательно), чтобы никакой другой класс не мог его реализовать. Поскольку код теперь SomeImpl может иметь метод с именем DoSomething(), и его можно вызывать (он не будет переопределять метод с тем же именем из абстрактного класса, поскольку он не помечен как виртуальный), но я бы хотел обрезать возможность реализации такого метода в SomeImpl классе.

Возможно ли это?

Ответы [ 5 ]

9 голосов
/ 23 июня 2009

Методы в C # запечатаны по умолчанию. Однако ничего нельзя сделать , чтобы предотвратить скрытие метода (предоставление метода с тем же именем в производном классе, обычно с new).

Или, в этом отношении, переопределение интерфейса:

static void Main()
{
    ISomeInterface si = new EvilClass();
    si.DoSomething(); // mwahahah
}

public class EvilClass : ASomeAbstractImpl, ISomeInterface
{
    public override void A() {}
    public override void B() { }
    void ISomeInterface.DoSomething()
    {
        Console.WriteLine("mwahahah");            
    }
}
2 голосов
/ 23 июня 2009

Все методы запечатаны по умолчанию, но нет способа предотвратить скрытие членов.

Компилятор C # выдаст предупреждение компилятора всякий раз, когда вы скрываете член, но кроме этого вы не можете предотвратить это.

0 голосов
/ 23 июня 2009

При работе с интерфейсами и абстрактными классами важно больше о том, что вы ДОЛЖНЫ делать, а не о том, что вы не можете делать. Таким образом, вы можете сообщить пользователю интерфейса, что это методы, которые они должны реализовать, и с вашими абстрактными классами вы можете использовать ключевое слово virtual , чтобы сообщить им, что все в порядке, чтобы переопределить метод. Однако вы не можете помешать им делать слишком много. Даже если вы целенаправленно не используете ключевое слово virtual , его все равно можно скрыть с помощью ключевого слова new .

0 голосов
/ 23 июня 2009

если класс SomeImpl содержит метод DoSemthing, это означает, что он скрывает исходный, но не переопределяет.

0 голосов
/ 23 июня 2009

Метод, который не помечен как virtual , запечатан по умолчанию. В производном классе вы должны пометить «переопределяющий» метод ключевым словом new , иначе вы получите предупреждение компилятора. Если метод суперкласса помечен как виртуальный, вы можете запечатать его за закрытое переопределение .

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...