Xin lỗi vì tiêu đề mơ hồ, nhưng tôi không chắc cách tóm tắt điều này trong một cụm từ. Tôi có một tình huống với rất nhiều mã C# dư thừa, và nó thực sự trông giống như một số loại lừa crafty sử dụng một số tài sản thừa kế hoặc generics sẽ giải quyết này. Tuy nhiên, tôi không phải là một lập trình viên kinh nghiệm khủng khiếp (đặc biệt là với C#) và chỉ không thể nhìn thấy giải pháp.Gặp sự cố khi loại bỏ mã dư thừa thông qua kế thừa hoặc generics
Tình huống, ở dạng đơn giản, trông giống như thế này. Tôi có một loạt các lớp học mà tất cả thừa kế từ một loại.
public class Foo : SuperFoo
{
...
public Foo SomeMethod() { ... }
}
public class Bar : SuperFoo
{
...
public Bar SomeMethod() { ... }
}
public class Baz : SuperFoo
{
...
public Baz SomeMethod() { ... }
}
...
public class SuperFoo
{
...
}
Sự cố xảy ra khi thu thập các đối tượng này cần được xử lý. Giải pháp dự thảo đầu tiên của tôi (giải pháp xấu) trông giống như sau:
public void SomeEventHasHappened(...)
{
ProcessFoos();
ProcessBars();
ProcessBazes();
...
}
public void ProcessFoos()
{
...
foreach (var foo in fooList)
{
...
foo.SomeMethod();
}
}
public void ProcessBars()
{
...
foreach (var bar in barList)
{
...
bar.SomeMethod();
}
}
... v.v. Vấn đề là về cơ bản tất cả các mã trong các phương thức ProcessX là giống nhau, khác với kiểu của các đối tượng đang được vận hành. Nó sẽ là tốt đẹp để củng cố tất cả các thành một phương pháp vì lý do rõ ràng.
Suy nghĩ đầu tiên của tôi là chỉ cần tạo một phương thức Process() chung lấy một tham số List<SuperFoo>
và chỉ tiếp tục từ đó. Vấn đề là một SuperFoo chung không có SomeMethod(), và nó không thể có một vì mỗi lớp con 'SomeMethod() có kiểu trả về khác nhau, vì vậy việc ghi đè không hoạt động.
Tôi đã thấy mã nơi 'đối tượng' được trả về và sau đó truyền đến loại thích hợp. –
Trong khi đó sẽ giải quyết vấn đề như tôi đã trình bày nó ở đây, tôi nên làm rõ ... Tôi muốn loại không có 'SomeMethod()' trả về một 'đối tượng chung', bởi vì' SomeMethod() 'cũng được gọi trong nhiều nơi khác ngoài phần này của mã, và điều đó đòi hỏi phải đúc ở tất cả những nơi khác. Nhờ đề nghị mặc dù. – jloubert