Ограниченный тип объекта в .NET - PullRequest
1 голос
/ 03 декабря 2010

Давайте иметь библиотеку объектов Person, Cat, Dog, Pencil и Byke.

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

Давайте представим, что мы должны сохранить состояние Person, используя сериализацию, поэтому мы делаем все перечисленные объекты как Serializable.

Как мы теперь защищаем Человека от «введения» ему класса «FavoriteThing», такого как Cobra, который не соответствует требованиям (быть сериализуемым или другим, например, быть безобидным).

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Я не совсем уверен, чего именно вы хотите достичь, но если вы каким-то образом хотите иметь возможность определить, каким типам следует разрешить присваивать FavoriteThing, вы можете создать пустой интерфейс (давайте назовем это IFavorable) и объявить FavoriteThing как принадлежащий к этому типу;

public interface IFavorable { }

class Person
{
    public IFavorable FavoriteThing { get; set; }
}

Затем вы заставляете разрешенные типы «реализовывать» этот интерфейс:

class Dog : IFavorable
{
    // ...
}

Это бы сработало, хотя я сам не большой поклонник таких "мета-интерфейсов" ...

2 голосов
/ 03 декабря 2010

Возможно, вы захотите написать тип FavoriteThing, который будет действовать как теговое объединение .Другими словами, у него есть свойство для каждого типа (персона, кошка и т. Д.), Но при этом обеспечивается, что оно содержит только одно значение за раз.Вам может не потребоваться явно поле тега, если все они являются ссылочными типами;просто убедитесь, что только одно из ваших строго типизированных полей не является нулевым за раз.Вам нужно будет предоставить способ определения , какой тип имеет значение.

Другой вариант - заставить все эти типы реализовывать общий интерфейс, но может не будет подходящим дизайном, если эти типы не должны знать о «любимой» концепции.

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

1 голос
/ 03 декабря 2010

Лучше всего в вашей недавней публикации, это относится к List<object>, да?

В этом случае я бы не использовал object - я бы использовал общий базовый класс:

[Serializable]
public class FavoriteThing {} // this is probably a bad name...

[Serializable]
public class Dog : FavoriteThing {}

[Serializable]
public class Pencil : FavoriteThing {}

(и используйте List<FavoriteThing> вместо List<object>)

Обратите внимание, что не не обеспечивает [Serializable] - никакая проверка компилятором не может этого сделать; но он действительно сохраняет его в здравом уме - т.е. не (случайно) a HttpWebRequest

Кроме того, несколько сериализаторов будут успешно работать с моделью базового класса, которая не будет работать со случайными object с - например, DataContractSerializer, XmlSerializer и т. Д. Обычно я предпочитаю инкапсуляция по наследованию, но для сериализации / DTO базовый класс обычно самый простой вариант.

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