помощь в наследовании c # - PullRequest
4 голосов
/ 16 ноября 2010

Я довольно новичок в наследстве и хотел кое-что спросить.У меня есть базовый класс, который имеет множество функций, которые совместно используются несколькими производными классами.

Единственное отличие для каждого производного класса - это единственный метод с именем Name.Функциональные возможности одинаковы для каждого производного класса, но существует необходимость в различении имени.

У меня есть свойство в базовом классе, которое называется Name.Как мне сделать так, чтобы каждый производный класс мог переопределять свойство базового класса?

Спасибо.

Ответы [ 7 ]

4 голосов
/ 16 ноября 2010

Объявите ваш метод как virtual

public class A
{
    public virtual string Name(string name)
    {
        return name;
    }
}
public class B : A
{
    public override string Name(string name)
    {
        return base.Name(name); // calling A's method
    }
}
public class C : A
{
    public override string Name(string name)
    {
        return "1+1";
    }
}
3 голосов
/ 16 ноября 2010

Вы можете объявить его с помощью виртуального или абстрактного ключевого слова в базовом классе, тогда производный класс может переопределить его

3 голосов
/ 16 ноября 2010

Используйте свойство virtual :

class Base
{
    public virtual string Foo
    {
        get;
        set;
    }
}

class Derived : Base
{
    public override string Foo
    {
        get {
            // Return something else...
        }
        set {
            // Do something else...
        }
    }
}
2 голосов
/ 16 ноября 2010

В базовом классе:

public virtual string Name { get; set; }

В производных классах:

public override string Name { get; set; }

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

, например

public class MyObject
{
     public string Name { get; private set; }

     public enum ObjectType { TypeA, TypeB, ... }

     public MyObject(ObjectType obType)
     {
          switch (obType)
          {
              case ObjectType.TypeA:
                  Name = "Type A";
              // and so on
          }
     }
} 
2 голосов
/ 16 ноября 2010

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

class Base
{
    public virtual string Name { get; set; }
}

Но оно вам нужно?быть доступным для записи?Свойство только для чтения может иметь больше смысла, в этом случае это может работать:

class Base
{
    public virtual string Name
    {
        get { return "BaseName"; }
    }
}

class Derived : Base
{
    public override string Name
    {
        get { return "Derived"; }
    }
}
2 голосов
/ 16 ноября 2010

Чтобы каждый производный класс мог переопределить свойство, вам просто нужно пометить свойство как виртуальное

class Base {
  public virtual Property1 { 
    get { ... }
    set { ... }
  }
}
2 голосов
/ 16 ноября 2010

вам нужно объявить вашу собственность (в базовом предложении) как virtual

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