我在這里問的問題使我對我的專案有這么大的了解:
abstract class Base<T> where T:ContentBase
{
//base functionality
}
class Foo : Base<FooContent>
{
//overrides
}
class Bar : Base<BarContent>
{
//overrides
}
有沒有辦法制作一個可以同時包含 Foo 和 Bar 物件的陣列或 List ,或者我是否必須考慮制作記錄或其他東西?
提前致謝。
uj5u.com熱心網友回復:
您可以添加一個繼承自的非泛型抽象類Base,Base<T>然后創建一個List<Base>. 所以擴展你的代碼可能看起來像這樣:
abstract class Base
{
//base functionality (non-generic)
}
abstract class Base<T> : Base where T : ContentBase
{
//base functionality acting on T
}
class Foo : Base<FooContent>
{
//overrides
}
class Bar : Base<BarContent>
{
//overrides
}
uj5u.com熱心網友回復:
我從示例代碼中假設FooContent并BarContent派生自ContentBase. 我還假設代碼遵循 SOLID 原則,尤其是 LSP。
通用集合可以根據ContentBase.
var collection = new List<ContentBase>();
FooContent該集合可以包含、BarContent和的實體ContentBase。
但顯然這是需要ContentBase在另一種型別中保存和派生型別。(從問題中不清楚為什么需要這樣做。)
public class ContentAdaptor
{
public ContentAdaptor(ContentBase content)
{
_content = content;
}
...
private ContentBase _content;
}
該ContentAdaptor型別包含對 的實體的參考ContentBase。該實體可以是派生型別。
集合ContentAdaptor:
var collection = new List<ContentAdaptor>();
我懷疑FooContent并且BarContent可能違反 LSP 并且不能相互替代。是這樣嗎?如果您有根本不同的型別,但您想以多型方式處理物件,請考慮使用介面。
public interface IProcess
{
bool Process();
}
這里ContentBase實作了IProcess介面。但請注意,SomeOtherContent不是派生自的型別也ContentBase可以實作IProcess介面。
public class ContentBase : IProcess
{
// Implement the IProcess interface.
}
集合IProcess:
var collection = new List<IProcess>();
Process可以在集合中的每個物件上呼叫該方法。每種型別都提供了自己的Process方法實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516378.html
標籤:C#数组仿制药数据结构
