Найдено результатов: 9

Наследование и полиморфизм - простота использования против чистоты

В проекте наша команда использует списки объектов для выполнения массовых операций над наборами данных, которые должны обрабатываться аналогичным образом. В частности, различные объекты идеально действовали бы одинаково, что было бы очень легко достигнуто с помощью полиморфизма. Проблема, с которой я сталкиваюсь, заключается в том, что наследование подразумевает, что это отношение, а не имеет отношения. Например, у нескольких объектов есть счетчик повреждений, но чтобы сделать это простым в использовании в списке объектов, можно использовать полиморфизм - за исключением того, что это будет означать отношение, которое не будет истинным. (Человек не является счетчиком ущерба.)

Единственное решение, которое я могу придумать, состоит в том, чтобы член класса возвращал правильный тип объекта при неявном приведении вместо того, чтобы полагаться на наследование. Было бы лучше отказаться от is a / has a ideal в обмен на простоту программирования?

Редактировать: Чтобы быть более конкретным, я использую C++, поэтому использование полиморфизма позволит различным объектам "act the same" в том смысле, что производные классы могут находиться в одном списке и управляться виртуальной функцией базового класса. Использование интерфейса (или имитация их через наследование) кажется решением, которое я хотел бы использовать.

c++   inheritance   oop   polymorphism    

515   10   23:57, 23rd August, 2020


Вызов базового конструктора в C#

Если я наследую от базового класса и хочу передать что-то из конструктора унаследованного класса конструктору базового класса, как это сделать?

Например,

Если я унаследовал от класса исключений я хочу сделать что-то вроде этого:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

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

c#   inheritance   constructor    

497   10   00:00, 3rd August, 2020


Как я могу переопределить метод EJB 3 session bean с общим аргументом - если это вообще возможно?

Предположим, у вас есть следующие EJB 3 interfaces/classes:

public interface Repository<E>
{
   public void delete(E entity);
}

public abstract class AbstractRepository<E>  implements Repository<E>
{
   public void delete(E entity){
      //...
   }
}

public interface FooRepository<Foo>
{
   //other methods
}

@Local(FooRepository.class)
@Stateless
public class FooRepositoryImpl extends
    AbstractRepository<Foo> implements FooRepository
{
   @Override
   public void delete(Foo entity){
      //do something before deleting the entity
      super.delete(entity);
   }
   //other methods
}

А затем еще один боб, который обращается к Бобу FooRepository :

//...
@EJB
private FooRepository fooRepository;

public void someMethod(Foo foo)
{
    fooRepository.delete(foo);
}
//...

Однако метод переопределения никогда не выполняется при вызове метода delete компонента FooRepository . Вместо этого выполняется только реализация метода delete, определенного в AbstractRepository .

Что я делаю неправильно или это просто ограничение Java/EJB 3, что дженерики и наследование еще не играют хорошо вместе ?

java   generics   inheritance   java-ee   ejb-3.0    

448   2   06:22, 17th August, 2020


В C#, нужно ли вызывать базовый конструктор?

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

class BaseClass
{
    public BaseClass()
    {
        // ... some code
    }
}
class MyClass : BaseClass
{
    public MyClass() // Do I need to put ": base()" here or is it implied?
    {
        // ... some code
    }
}

c#   inheritance   constructor    

461   7   18:58, 19th August, 2020


Это плохая идея, чтобы выставить иерархию наследования в структуре пространства имен?

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

Для примера рассмотрим следующие пространства имен и классы:

namespace Protocol
{
  public abstract class Message { }
  public abstract class Driver { }
}
namespace Protocol.Tcp
{
  public class TcpMessage : Message { }
  public class TcpDriver : Driver { }
}
namespace Protocol.Ftp
{
  public class FtpMessage : Message { }
  public class FtpDriver : Driver { }
}

Каков наилучший способ структурировать пространства имен? Кажется неизбежным выставлять наследование в пространстве имен, поскольку базовые классы на самом деле не принадлежат ни к пространству имен Protocol.Tcp, ни к пространству имен Protocol.Ftp.

c#   oop   inheritance   naming   convention    

433   3   07:40, 9th August, 2020


В C#, нужно ли вызывать базовый конструктор?

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

class BaseClass
{
    public BaseClass()
    {
        // ... some code
    }
}
class MyClass : BaseClass
{
    public MyClass() // Do I need to put ": base()" here or is it implied?
    {
        // ... some code
    }
}

c#   inheritance   constructor    

500   7   10:41, 3rd August, 2020


XML Serialization и унаследованные типы

Следуя из моего предыдущего вопроса , я работал над тем, чтобы моя объектная модель сериализовалась до XML. Но теперь я столкнулся с проблемой (quelle surprise!).

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

Я подумал, что было бы неплохо просто добавить атрибуты XML ко всем задействованным классам, и все будет замечательно. К сожалению, это не так!

Поэтому я немного покопался в Google и теперь понимаю, почему он не работает. В том, что XmlSerializer на самом деле делает некоторые умные размышления, чтобы сериализовать объекты в/из XML, и поскольку он основан на абстрактном типе, он не может понять, с чем, черт возьми, он говорит . Хорошо.

Я действительно наткнулся на эту страницу на CodeProject, которая выглядит так, как будто она может очень помочь (но все же читать/потреблять полностью), но я подумал, что хотел бы также перенести эту проблему в таблицу StackOverflow, чтобы посмотреть, есть ли у вас какие-либо аккуратные хаки/трюки, чтобы получить это и работать самым быстрым/легким способом.

Одно я должен также добавить, что я не хочу идти по маршруту XmlInclude . Там просто слишком много сцепления с ним, и эта область системы находится в тяжелом развитии, так что это будет настоящая головная боль обслуживания!

c#   xml   inheritance   serialization   xml-serialization    

520   7   16:53, 23rd August, 2020


Есть ли способ сделать конструктор видимым только для родительского класса в C#?

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

Есть ли способ скрыть конструктор от всего кода, кроме родительского класса.

Я хотел бы сделать это в основном

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return new ConcreteClassA();
        if (args == "b")
            return new ConcreteClassB();
    }
}

public class ConcreteClassA : AbstractClass
{
}

public class ConcreteClassB : AbstractClass
{
}

Но я хочу, чтобы никто не мог напрямую создавать экземпляры 2 конкретных классов. Я хочу убедиться, что только метод MakeAbstractClass() может создавать экземпляры базовых классов. Есть ли способ сделать это?

ОБНОВЛЕНИЕ
Мне не нужно обращаться к каким-либо конкретным методам ConcreteClassA или B из-за пределов абстрактного класса. Мне нужны только общедоступные методы, которые предоставляет мой абстрактный класс. Мне действительно не нужно предотвращать создание экземпляров конкретных классов, я просто пытаюсь избежать этого, поскольку они не предоставляют новых открытых интерфейсов, а просто разные реализации некоторых очень специфических вещей, внутренних для абстрактного класса.

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

Я думаю, что нет простого решения для этого...

c#   inheritance   oop    

551   9   03:01, 3rd August, 2020


В C++, что такое виртуальный базовый класс?

Я хочу знать, что такое "виртуальный базовый класс" и что он означает.

Позвольте мне привести пример:

class Foo
{
public:
    void DoSomething() { /* ... */ }
};

class Bar : public virtual Foo
{
public:
    void DoSpecific() { /* ... */ }
};

c++   virtual-inheritance    

603   10   23:47, 2nd August, 2020